Tsql 如果literal不包含通配符,为什么我不能用colliteral替换ISNULL(col,literal)notlike literal?
我遇到了一些旧代码,比如下面的示例:Tsql 如果literal不包含通配符,为什么我不能用colliteral替换ISNULL(col,literal)notlike literal?,tsql,sql-like,Tsql,Sql Like,我遇到了一些旧代码,比如下面的示例: 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) SEL
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
我的想法是,应该将ISNULLcol2、‘不要这个’和‘不要这个’替换为col2‘不要这个’,因为它可以完美地处理null情况
我可以使用BetterCol over CurrentCol中的表单作为何时表达式吗?如果不是,为什么?是否有我没有看到的边缘案例?TL;博士;-是的,你可以更换它-它几乎是完全安全的 较长版本: 在SQL Server中,除非指定了,而且确实不应该指定它—请注意,它已被弃用—否则将任何内容与null进行任何比较都将产生未知值,这基本上相当于大小写表达式或where子句谓词的false 这意味着SomeValue NULL和SomeValue=NULL,甚至NULL=NULL和NULL-NULL都将返回UNKNOWN
虽然我在SET ANSI_NULL中没有找到NULL和类似操作符行为的任何文档,众所周知,对于like运算符和=运算符,null的行为是相同的,这意味着像'some string'这样的null也将返回UNKNOWN。很少使用没有特殊字符(如%、\等)的like。请确保没有这样的行为,以便安全地替换表达式。您还可能从索引中获益,因为ISNULL将使它们的使用无效,因为它将函数应用于跟踪列。谢谢。是的,我们使用的是ANSINULLS,因此我试图理解为什么代码没有这样写!