基于多个可为空的列派生计算列

ian*_*ain 7 null sql-server computed-column sql-server-2017

我有点像 SQL 新手。

我一直在尝试创建一个TAG从其他 5 个列调用的自动生成的列,其中一些可以保留 NULL 标记。

用于创建自动生成列的语法是:

[Tag]  AS ([Tag Type]+[Parent Tag Type]+[Tag Area No]+[Tag seq No]+[Tag Suffix])
Run Code Online (Sandbox Code Playgroud)

如果五列都没有保留 NULL,则自动生成 OK ,但是如果我尝试使用包含 NULL 的任何一列创建一行,自动生成不起作用,并将TAG列留空,即使它创建了行确定所有单独的列数据。

有没有办法让自动生成与 NULL 一起工作?

Pau*_*ite 8

您可以在 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;
Run Code Online (Sandbox Code Playgroud)

输出:

标签类型 | 父标签类型 | 标签区号 | 标记序列号 | 标签后缀 | 标签     
:------- | :-------------- | ----------: | ---------: | :--------- | :-------
T |             | 第1234章 1 | 空值       | T12341  
T | P | 5678 | 1 | | | TP56781S

... 以防万一该示例已简化并且元素之间要使用分隔符,请查看CONCAT_WS()SQL Server 2017 中引入的内容。


Eri*_*ing 6

是的,您需要使用ISNULL它来做到这一点:

ISNULL([Tag Type], '') +
ISNULL([Parent Tag Type], '') +
ISNULL([Tag Area No], '') +
ISNULL([Tag seq No], '') +
ISNULL([Tag Suffix], '')
Run Code Online (Sandbox Code Playgroud)

但公平的警告,如果任何行NULL跨越整个事情,你最终会得到一个空字符串。ISNULL如有必要,您可能希望使用 Canary 值将整个内容包装起来,以避免出现这种情况。

根据数据类型,您可能还需要将CONVERT您的列转换为字符串类型ISNULL以避免出错。