我想在集合的每一行上应用OUTER APPLY计算。此计算将多个字符串字段连接为一个,但有时这些字段为null或用空字符串填充。串联使用“-”作为字段之间的分隔符,因此当它们为空('')时,结果为'----'而不是NULL,这是我想要的结果。
在进行此计算之前,我需要检查这些字段的值。
你会怎么做?
我考虑过使用NULLIF,并且它的行为似乎与我预期的一样,但是我不知道为什么。
NULL +'something'的连接是否总是NULL?为什么?
SELECT
string_1,
string_2,
string_3,
string_4,
string_5,
string_concat,
FROM Table1
OUTER APPLY(VALUES(NULLIF(string_1,'')+'-'+NULLIF(string_2,'')+'-'+NULLIF(string_3,'')+'-'+NULLIF(string_4,'')+'-'+NULLIF(string_5,''))) v1(string_concat)
表1没有任何索引,我也无法实现任何索引。
此代码在性能上是否比在SELECT中执行CASE更好?
我喜欢它,因为代码看起来更干净。
答案 0 :(得分:3)
NULL + NULL +'something'的串联是否总是NULL? 为什么?
这取决于SET CONCAT_NULL_YIELDS_NULL
的设置。如果它是ON
(默认设置),则是,将NULL
与+
运算符连接将始终产生NULL
虽然我可能会这样做
SELECT string_1,
string_2,
string_3,
string_4,
string_5,
string_concat,
FROM Table1
CROSS APPLY(VALUES (NULLIF(CONCAT(string_1, '-', string_2, '-', string_3, '-', string_4, '-', string_5), '----')) ) v1(string_concat)
所以只需要一个NULLIF
-在CONCAT
结果上。
由于VALUES
子句始终只返回一行,因此您可以使用CROSS APPLY
答案 1 :(得分:1)
NULL +'something'的连接是否总是NULL?为什么?
除了已经给出的技术解释之外,您可能还对为什么这样的逻辑动机感兴趣。
NULL实际上表示您不了解某些内容,或者某些内容不适用,因此无法在该上下文中使用。因此,您对不知道或没有意义的事情做的任何事情都会产生“我仍然不知道/没有意义”的结果。
例如:假设您的一个朋友有2辆汽车,而您的另一个朋友有2辆汽车,但您不知道有多少辆。如果我想问问你的朋友总共有多少辆汽车,那么你只能给我一个答案,那就是你真的不知道。
希望这有助于理解。 NULL的问题远不止于此,因为它涉及的是三值逻辑,而不是更常见且广为人知的二值逻辑。以下是有关此问题的更多详细信息:http://www.dbdebunk.com/2017/04/null-value-is-contradiction-in-terms.html