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 一起工作?
您可以在 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 中引入的内容。
是的,您需要使用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
以避免出错。
归档时间: |
|
查看次数: |
529 次 |
最近记录: |