【问题标题】:!IsNullOrEmpty equivalent in SQL server!IsNullOrEmpty 在 SQL 服务器中等效
【发布时间】:2020-01-18 00:52:21
【问题描述】:

我正在创建一个 SSRS 报告,并在编写查询期间查找需要在查询中检索的数据的代码逻辑。 !String.IsNullOrEmpty 方法有很多用法,所以我想知道在 SQL Server 中进行等效检查的最短和最佳方法是什么?

WHERE t.Name IS NOT NULL OR T.Name != ''

或者....

WHERE LEN(t.Name) > 0

哪一个是正确的?还是有其他选择?

【问题讨论】:

  • WHERE ISNULL(T.Name, '') != ''
  • 两者(加上@DenisRubashkin 之一)都应该工作
  • 只需意识到 SQL 中会忽略尾随空格。所以' ' = '' 的计算结果为真。
  • @HoneyBadger 有趣的行为
  • @HoneyBadger 见this

标签: sql-server


【解决方案1】:

如果想要的结果是最简单的单行那么:

WHERE  NULLIF(Name, '') IS NOT NULL 

但是,从性能的角度来看,以下替代方案是 SARGable,因此索引可能可用于发现和过滤具有此类值的记录

WHERE  Name IS NOT NULL  AND Name != ''

一个例子:

;WITH cte AS (
 SELECT 1 AS ID, '' AS Name UNION ALL
 SELECT 2, '  ' UNION ALL
 SELECT 3, NULL UNION ALL
 SELECT 4, 'abc' 
)


SELECT * FROM cte
WHERE  Name IS NOT NULL  AND Name != ''

结果:

ID  Name
---------
4   abc

【讨论】:

    【解决方案2】:

    在 T-SQL 中没有内置的 IsNullOrEmpty() 等价物,这主要是因为比较字符串时会忽略尾随空格。您的选择之一:

    where len(t.Name) > 0
    

    就足够了,因为len() 也会忽略尾随空格。不幸的是,它会使表达式成为非 SARGable,并且可能不会使用 Name 列上的任何索引。但是,这个应该可以解决问题:

    where t.Name > ''
    

    附:为了完整起见,datalength() 函数将所有字符都考虑在内;但是请记住,它返回 字节 的数量,而不是字符,因此对于任何 nvarchar 值,结果将至少是您预期的两倍(并且使用补充字符/代理对如果我没记错的话,这个数字应该更高)。

    【讨论】:

    • 对于 SARGable 注释,+1。大多数人没有意识到这有多重要。
    【解决方案3】:

    是的,您可以使用 WHERE LEN(t.Name)>0。 您也可以进行如下验证:

    -- 统计总记录数

    从 tblName 中选择 COUNT(1) 作为 t

    -- 统计 'NULL' 或 'Blank' 记录的总数

    SELECT COUNT(1) FROM tblName as t WHERE ISNULL(t.Name,'')= ''

    -- 统计“NOT NULL”记录的总数

    SELECT COUNT(1) FROM tblName as t WHERE LEN(t.Name)>0

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-08
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 2021-01-08
      • 2015-11-01
      • 1970-01-01
      • 2019-12-23
      相关资源
      最近更新 更多