我遇到了一些旧代码,例如以下示例:
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'
,因为它可以完美地处理空值情况。
我可以在CurrentCol中使用BetterCol中的表单作为WHEN表达式吗?如果不是,为什么?我没有看到任何极端情况吗?
答案 0 :(得分:2)
TL; DR; -是的,您可以更换它-(几乎)绝对安全。
较长版本:
在SQL Server中,除非指定了SET ANSI_NULL OFF
(并且实际上永远都不要指定它-注意它已过时),否则将任何与null
的比较都以{{1 }},基本上等于UNKNOWN
表达式或false
子句谓词的case
。
这意味着where
和SomeValue <> NULL
甚至SomeValue = NULL
和NULL = NULL
都将返回NULL <> NULL
尽管我没有找到关于UNKNOWN
和NULL
运算符的行为的任何文档(我在LIKE
,LIKE
和{{3}中进行了搜索}文档),众所周知,SET ANSI_NULL
的行为与null
运算符相同,与like
运算符相同-意味着=
将返回{ {1}}。