如果文字不包含通配符,为什么我不能用col <>文字替换ISNULL(col,literal)NOT LIKE文字的任何原因?

时间:2019-01-16 00:58:39

标签: tsql sql-like

我遇到了一些旧代码,例如以下示例:

DROP TABLE IF EXISTS #dates;

SELECT
    CONVERT(VARCHAR(10), my_date_table.date_field, 101) AS date_string
INTO #dates
FROM my_date_table
INNER JOIN (
    SELECT [value]
    FROM STRING_SPLIT(@DateIDs, '|')  
) date_ids
    ON date_ids.[value] = my_date_table.id
;

SET @returnDates = COALESCE(
    JSON_VALUE(
        REPLACE(
            (
                SELECT
                    _ = date_string
                FROM #dates
                FOR JSON PATH
            )
        ,'"},{"_":"',', '),'$[0]._'
    )
, '');

我的想法是 DECLARE @tmpVal INT = 999 DECLARE @tmpTable TABLE (col1 INT, col2 VARCHAR(20)) INSERT INTO @tmpTable (col1, col2) VALUES (1, 'Do not want this'), (2, 'Happy with this'), (3, NULL) SELECT col1, col2, -- I see code like this CASE WHEN ISNULL(col2, 'Do not want this') NOT LIKE 'Do not want this' THEN @tmpVal END AS CurrentCol, -- can I replace it with code like this because there is no else? CASE WHEN col2 <> 'Do not want this' THEN @tmpVal END AS BetterCol FROM @tmpTable 应该替换为ISNULL(col2, 'Do not want this') NOT LIKE 'Do not want this',因为它可以完美地处理空值情况。

enter image description here

我可以在CurrentCol中使用BetterCol中的表单作为WHEN表达式吗?如果不是,为什么?我没有看到任何极端情况吗?

1 个答案:

答案 0 :(得分:2)

TL; DR; -是的,您可以更换它-(几乎)绝对安全。

较长版本:

在SQL Server中,除非指定了SET ANSI_NULL OFF(并且实际上永远都不要指定它-注意它已过时),否则将任何与null的比较都以{​​{1 }},基本上等于UNKNOWN表达式或false子句谓词的case

这意味着whereSomeValue <> NULL甚至SomeValue = NULLNULL = NULL都将返回NULL <> NULL

尽管我没有找到关于UNKNOWNNULL运算符的行为的任何文档(我在LIKELIKE和{{3}中进行了搜索}文档),众所周知,SET ANSI_NULL的行为与null运算符相同,与like运算符相同-意味着=将返回{ {1}}。