SQL:交换MUTUALLY EXCLUSIVE列?

时间:2013-09-05 07:48:42

标签: sql multiple-columns swap

我有一个包含NAME和ID列的表。例如,

[ID] [NAME]
 1   John Lee
 2   Ben Smith

我想切换两个用户的名称(他们的ID将保持不变)。但是,我正在使用的数据库不允许两个用户拥有相同的NAME(甚至不是NULL),因此我不能将“Ben Smith”设置为“John Lee”,除非没有用户拥有名称“John Lee”。

我想我可以通过PHP完成它并将它们的名字存储在变量中,然后进行查询以将两个NAME更改为随机的,然后将交换的NAME分配给用户。

但是有更优雅的方式吗?

2 个答案:

答案 0 :(得分:1)

使用案例表达

Update Table set
  name = case name 
         when 'John Lee' then 'Ben Smith'
         when 'Ben Smith' then 'John Lee' End
From table 
Where name in ('John Lee', 'Ben Smith')

答案 1 :(得分:0)

我有这个解决方案。它取代了一次交易中的名称。

DECLARE @names AS TABLE (id INTEGER, name VARCHAR(50), UNIQUE(name))

INSERT INTO @names (id, name) VALUES (1, 'John')
INSERT INTO @names (id, name) VALUES (2, 'Ben')


UPDATE N SET name = N2.name
FROM @names N
INNER JOIN (VALUES(1,2),(2,1)) S (old, new) ON N.id = S.old
INNER JOIN @names N2 ON S.new = N2.id

SELECT * FROM @names