SQL:在Where子句中使用Len()在一次操作中过滤NULL和BLANKS

标签 sql sql-server t-sql

上周我从一位同事那里听到 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 的行而不是如果 falseunknown

所以如果你看看 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
<表类=“s-表”> <标题> 第 1 列 Len(第 1 列) Len(第 1 列)> 0 第 1 列 <> '' <正文> 测试 4 正确 正确 1 1 正确 正确 空 空 未知 未知 0 错误 错误

但上表还显示,出于同样的原因,更简单的谓词 Col1 <> ''也有效。

Col1 <> ''是可控制的(可以使用索引范围搜索)。

即使在没有索引的计划中,使用可控制表达式来代替不可控制表达式在更准确的基数估计方面仍然是有益的。

关于SQL:在Where子句中使用Len()在一次操作中过滤NULL和BLANKS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76018206/

相关文章:

mysql - SQL 根据时间戳按年月排序

sql-server - 唯一的 RID 会是 "overflow"吗?

SQL Server 存储过程 - 将数据类型 varchar 转换为 datetime 时出错

sql - TSQL - 将 IN 与 PIVOT 结合使用

sql - 如何将变量传递给 SqlCommand

sql-server - 更改 SQL Server 中列的数据类型

mysql - 如何让这个SQL查询更加高效?

sql - 在同一张表中扩展问题多对多关系

c# - 将 SQL 查询和变量添加到 SharePoint ASPX 页面

SQL 错误 : "Must declare the scalar variable" when passing a table parameter to a table-valued function