2010-05-17 60 views
4

基本上我有三个字段,我正在创建一个新的字段,这三个字段组成了一个邮寄地址;问题是某些字段包含空值,并将myString添加到null只会在sql中产生空值。你能优化这段代码吗? T-SQL

所以这是我的代码,任何人都可以让它更清洁?它仍然看起来很漂亮!

UPDATE [mydb].[dbo].[Account] 
    SET [Billing Street] = CASE 
    WHEN [(Billing Address 1)] is null and [(Billing Address 2)] is null THEN [(Billing Address 3)] 
    WHEN [(Billing Address 1)] is null and [(Billing Address 3)] is null THEN [(Billing Address 2)] 
    WHEN [(Billing Address 2)] is null and [(Billing Address 3)] is null THEN [(Billing Address 1)] 
    WHEN [(Billing Address 1)] is null THEN [(Billing Address 2)] + ' ' + [(Billing Address 3)] 
    WHEN [(Billing Address 2)] is null THEN [(Billing Address 1)] + ' ' + [(Billing Address 3)] 
    WHEN [(Billing Address 3)] is null THEN [(Billing Address 1)] + ' ' + [(Billing Address 2)] 
    ELSE [(Billing Address 1)] + ' ' + [(Billing Address 2)] + ' ' + [(Billing Address 3)] 
    END 
+0

是否有3个不同的字段存储这个开始与什么特别的原因? – 2010-05-17 10:09:51

+0

该数据来自一个输入文件,我们做各种各样的魔术,所以它需要保持不变 – Yoda 2010-05-17 10:43:40

+0

我认为这个堆栈交换[提案](http://area51.stackexchange.com/proposals/11464/code-review ?referrer = aWNm_PdciyFqjFW8CUacGw2“代码评论”)可能会对你感兴趣。如果它显示你的支持,并帮助它进入测试版! :) – greatwolf 2011-01-16 23:59:29

回答

7

你可以使用isnullltrim,以消除任何前导空格:

update [mydb].[dbo].[Account] 
set [Billing Street] = ltrim(isnull([(Billing Address 1)], '') + 
         isnull(' ' + [(Billing Address 2)], '') + 
         isnull(' ' + [(Billing Address 3)], '')) 
+0

+1 - 删除我的基本上是相同的,只是使用coalesce。 – AdaTheDev 2010-05-17 09:44:50

+0

不错的工作!最后一个参数的第一个参数后面的braket轻轻地绊了我一眼,但那甜得像坚果,谢谢:) – Yoda 2010-05-17 09:49:00

2

如果旧的和新的列会共存,你最好创建一个计算列 - 这样,他们永远不会与对方“失去同步”。

采取Andomars语句,将其更改为读取:

ALTER TABLE Account ADD 
    [Billing Street] AS LTRIM... 

凡LTRIM ......继续在Andomar的答案