我有一张表(相当标准),其中包含以下列
ADDRESS1
ADDRESS2
ADDRESS3
ADDRESS4
POSTCODE
我想要一些T-SQL,我可以应用它来删除NULL值并将值向上移动(我希望尽可能避免使用游标和循环)
所以,如果我的数据是
ID ADDRESS1 ADDRESS2 ADDRESS3 ADDRESS4 POSTCODE
-----------------------------------------------------
1 50 The Street NULL The Town The City AB12 3GG
2 100 Avenue Townsville NULL Metropolis SG33 5WW
3 My House NULL NULL FutureCity KL21 6TT
它变成了
ID ADDRESS1 ADDRESS2 ADDRESS3 ADDRESS4 POSTCODE
-----------------------------------------------------
1 50 The Street The Town The City NULL AB12 3GG
2 100 Avenue Townsville Metropolis NULL SG33 5WW
3 My House FutureCity NULL NULL KL21 6TT
(即:所有非NULL值都向左移动,但邮政编码保持静态)
非常感谢
答案 0 :(得分:1)
我认为你需要从每一列转移三个更新语句。
UPDATE YourTable
SET ADDRESS1 = ADDRESS2,
ADDRESS2 = ADDRESS3,
ADDRESS3 = ADDRESS4,
ADDRESS4 = NULL
WEHRE ADDRESS1 IS NULL
GO
UPDATE YourTable
SET ADDRESS2 = ADDRESS3,
ADDRESS3 = ADDRESS4,
ADDRESS4 = NULL
WEHRE ADDRESS2 IS NULL
GO
UPDATE YourTable
SET ADDRESS3 = ADDRESS4,
ADDRESS4 = NULL
WEHRE ADDRESS3 IS NULL
GO
答案 1 :(得分:1)
答案 2 :(得分:1)
“Low Chee Mun”提供的解决方案几乎是正确的。如果只有一个地址为空,那么它是正确的,但是您已经调用了更新语句3次,如下所示(例如,如果3个地址为空)。
update T
set ADDRESS1 = (case when ADDRESS1 is null then ADDRESS2 else ADDRESS1 end),
ADDRESS2 = (case when ADDRESS1 is null or ADDRESS2 is null then ADDRESS3 else ADDRESS2 end),
ADDRESS3 = (case when ADDRESS1 is null or ADDRESS2 is null or ADDRESS3 is null then ADDRESS4 else ADDRESS3 end),
ADDRESS4 = (case when ADDRESS1 is null or ADDRESS2 is null or ADDRESS3 is null or ADDRESS4 is null then null else ADDRESS4 end)
from ADDR T;
update T
set ADDRESS1 = (case when ADDRESS1 is null then ADDRESS2 else ADDRESS1 end),
ADDRESS2 = (case when ADDRESS1 is null or ADDRESS2 is null then ADDRESS3 else ADDRESS2 end),
ADDRESS3 = (case when ADDRESS1 is null or ADDRESS2 is null or ADDRESS3 is null then ADDRESS4 else ADDRESS3 end),
ADDRESS4 = (case when ADDRESS1 is null or ADDRESS2 is null or ADDRESS3 is null or ADDRESS4 is null then null else ADDRESS4 end)
from ADDR T;
update T
set ADDRESS1 = (case when ADDRESS1 is null then ADDRESS2 else ADDRESS1 end),
ADDRESS2 = (case when ADDRESS1 is null or ADDRESS2 is null then ADDRESS3 else ADDRESS2 end),
ADDRESS3 = (case when ADDRESS1 is null or ADDRESS2 is null or ADDRESS3 is null then ADDRESS4 else ADDRESS3 end),
ADDRESS4 = (case when ADDRESS1 is null or ADDRESS2 is null or ADDRESS3 is null or ADDRESS4 is null then null else ADDRESS4 end)
from ADDR T;