上周我从一位同事那里听到 LEN () 不解析 NULL。它不会在 SELECT 语句中解析为零,但是在 WHERE 语句中可以工作,并且工作得很好。是否有任何理由不应该在 where 子句中使用 Len() 在一次操作中过滤掉 Null 和空白 ('')?
Drop table if exists #TestNull
Create table #TestNull (Col1 varchar(20))
Insert into #TestNull(Col1)
Values ('test'), ('1'),(Null),('')
--Len in Where statement
Select *
From #TestNull
Where Len(Col1) > 0 --ignore null and blanks
--Len in Select statement
Select Len(Col1) --Null comes back as null but blanks will return zero.
From #TestNull;
最佳答案
SQL 使用三值逻辑。
WHERE
子句仅返回谓词为 true
的行而不是如果 false
或unknown
所以如果你看看 Len(Col1)
返回什么Len(Col1) > 0
评估到然后应该清楚为什么这有效
Select Col1,
[Len(Col1)] = Len(Col1),
[Len(Col1) > 0] = CASE WHEN Len(Col1) > 0 THEN 'True' WHEN NOT(Len(Col1) > 0) THEN 'False' ELSE 'Unknown' END,
[Col1 <> ''] = CASE WHEN Col1 <> '' THEN 'True' WHEN NOT(Col1 <> '') THEN 'False' ELSE 'Unknown' END
From #TestNull
但上表还显示,出于同样的原因,更简单的谓词 Col1 <> ''
也有效。
和Col1 <> ''
是可控制的(可以使用索引范围搜索)。
即使在没有索引的计划中,使用可控制表达式来代替不可控制表达式在更准确的基数估计方面仍然是有益的。
关于SQL:在Where子句中使用Len()在一次操作中过滤NULL和BLANKS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76018206/