Sql-Server

基於幾個可為空的列派生計算列

  • June 15, 2018

我有點 SQL 新手。

我一直在嘗試創建一個TAG從其他 5 個列呼叫的自動生成列,其中一些列可以保留 NULL 標記。

用於創建自動生成列的語法是:

[Tag]  AS ([Tag Type]+[Parent Tag Type]+[Tag Area No]+[Tag seq No]+[Tag Suffix])

如果五列中沒有一列保留 NULL,則此自動生成 OK ,但如果我嘗試使用包含 NULL 的任何一列創建行,則自動生成不起作用,並將TAG列留空,即使它創建了行可以使用所有單獨的列數據。

有沒有辦法讓自動生成與 NULL 一起使用?

您可以在 SQL Server 2012 或更高版本中使用該CONCAT函式NULL,它會自動忽略,並在必要時將輸入隱式轉換為字元串類型。

範例

CREATE TABLE #Demo
(
   [Tag Type] char(1) NOT NULL,
   [Parent Tag Type] char(1) NULL,
   [Tag Area No] integer NOT NULL,
   [Tag seq No] integer NOT NULL,
   [Tag Suffix] char(1) NULL,

   [Tag] AS 
       CONCAT([Tag Type], [Parent Tag Type], [Tag Area No], [Tag seq No], [Tag Suffix])
);

INSERT #Demo
   ([Tag Type], [Parent Tag Type], [Tag Area No], [Tag seq No], [Tag Suffix])
VALUES
   ('T', NULL, 1234, 1, NULL),
   ('T', 'P', 5678, 1, 'S');

SELECT * FROM #Demo AS D;

輸出:

標籤類型 | 父標籤類型 | 標籤區號 | 標籤序列號 | 標籤後綴 | 標籤 
:------- | :-------------- | ----------: | ---------: | :--------- | :-------
T | *空* | 第1234章 1 | *空* | T12341 
T | 磷 | 5678 | 1 | 小號 | TP56781S

…如果範例被簡化並且元素之間要使用分隔符,請查看CONCAT_WS()SQL Server 2017 中引入的內容。

是的,你需要使用ISNULL來做到這一點:

ISNULL([Tag Type], '') +
ISNULL([Parent Tag Type], '') +
ISNULL([Tag Area No], '') +
ISNULL([Tag seq No], '') +
ISNULL([Tag Suffix], '')

但公平的警告,如果有任何一行NULL跨越整個事情,你最終會得到一個空字元串。如果有必要,您可能希望用金絲雀值包裝整個事物ISNULL以避免這種情況。

根據數據類型,您可能還需要將CONVERT您的列轉換為字元串類型,ISNULL以避免錯誤。

引用自:https://dba.stackexchange.com/questions/209709