如何在SQL中修剪NULL地址值

时间:2014-07-14 09:07:45

标签: sql-server sql-server-2008

我有一张表(相当标准),其中包含以下列

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值都向左移动,但邮政编码保持静态)

非常感谢

3 个答案:

答案 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)

没问题,不需要循环或游标,

使用更新,每次检查值本身或以上级别

示例:http://sqlfiddle.com/#!6/ba1cb/3

答案 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;