2011-07-06 119 views
1

我想創建一個計算列,它是其他幾列的連接。在下面的示例中,當任何'真實'列爲空時,結果集中的fulladdress爲null。如何調整計算列函數以考慮可空列?基於可空列的計算列

CREATE TABLE Locations 
(
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [fulladdress] AS (((([address]+[address2])+[city])+[state])+[zip]), 
    [address] [varchar](50) NULL, 
    [address2] [varchar](50) NULL, 
    [city] [varchar](50) NULL, 
    [state] [varchar](50) NULL, 
    [zip] [varchar](50) NULL 
) 

在此先感謝

回答

4

這就會變得混亂相當快,但這裏是一個開始:

ISNULL(address,'')  + ' ' 
    + ISNULL(address2,'') + ' ' 
    + ISNULL(city,'')  + ' ' 
    + ISNULL(state,'') + ' ' 
    + ISNULL(zip,'') 

(如果isnull不起作用,你可以嘗試​​3210如果沒有工作,分享。你正在使用什麼DMBS。)

+0

Thx,如果我想要用逗號分隔的字段(如果該列有一個值,將其附加一個逗號和一個空格)我該怎麼做? –

+2

如何:選擇合併(地址,'') + coalesce(','+ address2,'') + coalesce(','+ city,'') + coalesce(','+ state,'' ) + coalesce(','+ zip,'') 來自地點 –

1

你不應該有一個完整的地址列(這是其他列的副本)存儲在你的數據庫,除非你有一個去原因。正確的方法是在查詢中構造完整的地址字符串。通過動態創建字段,可以減少表中的冗餘,並且只需要少量的列來維護(在其他列更改時需要更新)。

在您的查詢,你會做這樣的事情

SELECT CONCAT(ISNULL(address,''), ISNULL(address2,''), ISNULL(city,''), ISNULL(state,''), ISNULL(zip,'')) AS fulladdress FROM Locations; 

CONCAT()功能進行串聯和ISNULL()向你字符串,如果它不是空或第二個參數(這是爲「」傳遞),如果它是null

+0

Thx。我不會堅持數據庫的fulladdress(因爲它是表定義中的一個計算列),所以沒有理由更新它。 –