如何在 sql server 2008 中交换列值?
Posted
技术标签:
【中文标题】如何在 sql server 2008 中交换列值?【英文标题】:How do I swap column values in sql server 2008? 【发布时间】:2010-11-16 20:25:31 【问题描述】:我有一张名为 Employee 的表
Eno ename AttributeValue AttributeName
1 aa a123 abc
2 bbb b123 dcf
3 cc c7sd wew3
我想将AttributeValue
列中的数据交换到AttributeName
和AttributeName
到AttributeValue
例如:
Eno ename AttributeValue AttributeName
1 aa abc a123
2 bbb dcf b123
3 cc wew3 c7sd
【问题讨论】:
【参考方案1】:UPDATE employee
SET AttributeValue = AttributeName,
AttributeName = AttributeValue
但是,除非两列具有完全相同的定义,否则您可能会丢失信息。
【讨论】:
"除非两列具有完全相同的定义,否则您可能会丢失信息。" - 只是为了确定,你是说除非两列是相同的数据类型,否则我们可以丢失信息?或者你的定义是什么意思?谢谢 @VoodooChild - 数据类型,是的。虽然这包括相关的精度和大小。 不敢相信这么简单。从 C++ 的思维方式出发,我的大脑一直在说“不……那行不通。这两个值最终都将是AttributeName
的初始值。”
@druciferre 这是声明式编程。说出你想要的,而不是如何完成它。
C++ 方法让我快要死了,这太棒了!好简单哇!【参考方案2】:
Update employee
Set attributeValue = attributeName,
attributeName = attributeValue
【讨论】:
【参考方案3】:update Employee set AttributeValue = AttributeName, AttributeName = AttributeValue
【讨论】:
【参考方案4】:对于大表来说,所有以前的技术都很慢,它们移动数据而不是重命名列,这是一个简单的解决方案:
ALTER TABLE "amplitude"
RENAME COLUMN "start_hour_displayed" TO "temp";
ALTER TABLE "amplitude"
RENAME COLUMN "start_hour" TO "start_hour_displayed";
ALTER TABLE "amplitude"
RENAME COLUMN "temp" TO "start_hour";
如果您有链接的功能视图,您必须在之前备份它们并在之后恢复它们。
【讨论】:
【参考方案5】:这是一个很好的例子
SELECT * from employees;
Go
DECLARE @temp as varchar(20)
update employees
set @temp = fname,
fname = lname,
lname = @temp
WHERE deptno = 10;
GO
SELECT * from employees;
【讨论】:
你能解释一下这种行为吗?数据库引擎是否首先将fname
分配给@temp
,然后将lname
分配给fname
,然后将@temp
分配给lname
?如果是这样,你如何解释set a=b, b=a
?
你为什么要这样做?您不需要交换变量,请查看 Oded 的答案。【参考方案6】:
Declare @myTable Table (id int, first_name varchar(50), last_name varchar(50));
Select * from Student
Insert Into @myTable (id, first_name, last_name) Select id, last_name, first_name from Student
MERGE
INTO Student std
USING @myTable tmp
ON std.id = tmp.id
WHEN MATCHED THEN
UPDATE
SET std.first_name = tmp.first_name,
std.last_name = tmp.last_name;
Select * from Student
输出
【讨论】:
【参考方案7】:只需在一次更新中交换两列:
Update registration
Set AttributeName = AttributeValue ,
AttributeValue = AttributeName where id in (1,2,3)
【讨论】:
【参考方案8】:更新员工 SET AttributeValue = AttributeName, AttributeName = AttributeValue 它不正确最好创建一个临时列并尝试代码 更新员工 SET temp=属性名 然后再一次 更新员工 SET AttributeName = AttributeValuee 再次
更新员工 SET AttributeValuee= temp
【讨论】:
以上是关于如何在 sql server 2008 中交换列值?的主要内容,如果未能解决你的问题,请参考以下文章
sql server 如何限制某一列值的数值长度 如:在某一数据库中图书证号必须是6位数字???谢谢啦