2012-01-08 70 views
4

我發佈了一個類似的問題,回到現在,因爲我需要更新此代碼,我回來問一個後續問題。上一個問題在這裏:
Computed column based on nullable columnsComputed Column(COALESCE vs CASE vs ISNULL)

我的數據(Address1, Address2, City, State, Zip, Country)可能有不完整的信息。即我無法保證除StateCountry列以外的任何內容都將具有數據。我想爲FullAddress計算一列。

以前,我使用COALESCE,如果所有字段都填寫好了,那麼效果很好。現在,由於數據要求已經放寬,這不再是一個選項(因爲我們在FullAddress中以重複逗號結束)。這裏是我以前使用過的(筆記,我只是在這裏使用SELECT語句以方便使用 - 一旦我有一些適用於所有情況的東西,將轉換爲計算列「alter table add」語句):現在

SELECT (((((COALESCE([Address1],'') 
    + COALESCE(', '+[Address2],'')) 
    + COALESCE(', '+[City],'')) 
    + COALESCE(', '+[State],'')) 
    + COALESCE(', '+[Zip],'')) 
    + COALESCE(', '+[Country],'')) AS FullAddress 
FROM Locations 

,我已經把使用CASE替代,但它仍然在那裏Address1 is NULL沒有爲邊緣的情況下工作(問題是,FullAddress會有「」作爲前兩個字符)

SELECT CASE WHEN [Address1] IS NOT NULL THEN [Address1] ELSE '' END 
     + CASE WHEN [Address2] IS NOT NULL THEN ', ' + [Address2] ELSE '' END 
     + CASE WHEN [City] IS NOT NULL THEN ', ' + [City] ELSE '' END 
     + CASE WHEN [State] IS NOT NULL THEN ', ' + [State] ELSE '' END 
     + CASE WHEN [Zip] IS NOT NULL THEN ', ' + [Zip] ELSE '' END 
     + CASE WHEN [Country] IS NOT NULL THEN ', ' + [Country] ELSE '' END 
     AS [FullAddress] 
FROM Locations 

我有點卡在這個po INT。任何建議接下來要嘗試什麼?

+0

有什麼問題? – 2012-01-08 03:13:34

+0

我的問題是:如何構造語句,以便在丟失數據的情況下(例如,丟失Address1),FullAddress計算列不以''開頭, – 2012-01-08 03:15:49

回答

6

您可以使用此模式:

SELECT 
    ISNULL(Address1 + ', ', '') 
    + ISNULL(Address2 + ', ', '') 
    + ISNULL(City + ', ', '') 
    -- .... 
    AS FullAddress 

concation NULL + ', '的結果是NULL =>Address1 + ', '將是NULL或有效地址=>ISNULL(Address1 + ', ', '')將是空字符串或有效地址。

+0

是的,現在看起來很有意義 - add對SQL中的任何內容都是NULL,並且它保持爲NULL。 – 2012-01-08 03:27:12

+2

我不知道如何「放寬」您的數據要求。如果例如你只有'城市'一欄的數據,你的輸出結尾會有一個額外的','。也許你應該考慮使用用戶定義函數。 – bfavaretto 2012-01-08 03:36:42

2
SELECT STUFF(
     COALESCE(', ' + Address1, '') + COALESCE(', ' + Address2, '') + ... 
     1, 
     2, 
     '' 
     ) AS FullAddress 
FROM Locations 

串聯的字符串將爲空或以(逗號和空格)開頭。 STUFF()將刪除前兩個字符並返回字符串的其餘部分。