【问题标题】:How to check for null/empty/whitespace values with a single test?如何通过单个测试检查 null/empty/whitespace 值?
【发布时间】:2010-11-05 19:43:38
【问题描述】:

我想编写一个 SELECT 语句,它只使用一个测试来返回没有值的列(null、空或所有空格)。

我认为这会起作用:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';

但这不适用于 NULL 值。

当然可以加

OR column_name IS NULL

它会起作用,但我想要一种使用单个测试的方法。

【问题讨论】:

  • 不希望有多个测试吗?即更细化 = 更好地向用户提供有关如何更正数据的反馈。
  • @onedaywhen:一般来说,有更多的粒度可能会更好,但我正在使用现有的代码库,我想尽可能地模仿现有的代码结构。当前的代码只做一个测试,所以我一直在寻找一个也只有一个测试的解决方案。

标签: sql oracle oracle10g


【解决方案1】:

功能上应该可以使用

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

问题在于不会使用 COLUMN_NAME 上的索引。如果这是一个选择性条件,您将需要在 TRIM(column_name) 上有一个基于函数的索引。

【讨论】:

  • T-SQL 用户注意:没有 TRIM,您需要 LTRIM 或 RTRIM。
  • SQL Server 2017 开始有了 TRIM 函数。 Source
  • @EhMann365 这个问题是关于 Oracle,而不是 Sql Server。
  • RTRIM(LTRIM(column_name)) - 适用于 Microsft SQL 用户。
  • 在 Sql Server TRIM(column_name) 中返回空字符串 '',而不是 NULL。其他答案同时支持空字符串和NULL
【解决方案2】:
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '') 如果 column_name 为 NULL,则返回 '',否则返回 column_name。

更新

在 Oracle 中,您可以使用NVL 来实现相同的结果。

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''

【讨论】:

  • 实际上这在 Oracle 中仍然不起作用,Oracle 将空字符串视为 NULL,因此您可能没有“not like ''”子句,因为它与空值进行比较
  • 我不想要 LIKE '' 而不是 NOT LIKE '' 吗?
  • 是的,抱歉,将原始问题误读为想要所有有价值的东西。但正如 tanging 指出的那样,这似乎不适用于 Oracle。
  • 由于我使用的是 Oracle,看来我可以使用 WHERE TRIM(col) IS NULL 来处理 null、空白和空白值。
  • 很明显,第一部分少了一个括号,应该是:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
【解决方案3】:

NULLIF 函数会将任何只有空格的列值转换为 NULL 值。适用于 T-SQL 和 SQL Server 2008 及更高版本。

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL

【讨论】:

  • 一个好的答案应该包含对代码的解释,以及为什么要这样写。我建议你更新你的答案:-)
  • 这有什么意义?将其设置为 [column_name] LIKE '' 会更有效
  • 需要TRIM来支持多个空格
  • 在 SQL Server 2017 上进行测试,这确实适用于没有 TRIM 的多个空格。这对我来说没有意义,因为根据文档 NULLIF 仅当两个表达式相等时才应返回 NULL ,并且一串空格通常不等于空字符串。 (我只测试了空格,而不是制表符、换行符或其他空白字符。)
  • @Jovie SQL Server 有时会忽略尾随空格,请阅读:stackoverflow.com/questions/17876478/…
【解决方案4】:

在检查列的null or Empty 值时,我注意到各种数据库中存在一些支持问题。

每个数据库都不支持 TRIM 方法。

下面的矩阵只是为了了解不同数据库支持的方法。

SQL 中的 TRIM 函数用于从字符串中删除指定的前缀或后缀。被删除的最常见模式是空格。该函数在不同数据库中的调用方式不同:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • 甲骨文: RTRIM(), LTRIM()
  • SQL 服务器: TRIM(), RTRIM(), LTRIM()

如何检查空/空/空白:-

下面是根据不同数据库的两种不同方式-

这些修剪函数的语法是:

  1. 使用Trim进行检查-

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. 使用 LTRIM 和 RTRIM 进行检查-

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

以上两种方式都提供相同的结果,只是根据您的数据库支持使用。它只是从UserDetails 表中返回FirstName,如果它有一个空的LastName

希望这对其他人也有帮助:)

【讨论】:

  • WITH t as (select ' ' c union all select '' c union all select NULL) SELECT * FROM t WHERE LTRIM(RTRIM(c)) IS NULL; SQL server 上没有返回 3 条记录
  • 为什么同时需要 L 和 RTRIM?不是只有一个函数就足以检查列是否为空吗?
【解决方案5】:

这个 phpMyAdmin 查询返回那些不为空或空或只是空格的行:

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))

如果您想选择为空/空/只是空格的行,只需删除 NOT。

【讨论】:

    【解决方案6】:

    使用下面的查询,它可以工作

    SELECT column_name FROM table_name where isnull(column_name,'') <> ''
    

    【讨论】:

      【解决方案7】:

      虽然@MerrickPlainview 的答案看起来很接近而且很小,但完整的答案(也可以按照 OP 的要求处理空白)是这样的:

      SELECT column_name FROM table_name WHERE NULLIF(TRIM(column_name), '') IS NOT NULL
      

      【讨论】:

        【解决方案8】:

        我在 T-SQL 中对IsNotNullOrEmptyOrWhiteSpace 使用的是:

        SELECT [column_name] FROM [table_name]
        WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0
        

        【讨论】:

          【解决方案9】:

          每个人都建议在 Oracle 中运行查询以查找特定字段为空白的记录(这不包括 (null) 或任何其他字段只是一个空白行)不起作用。我尝试了每一个建议的代码。我想我会继续在网上搜索。

          *****更新*****

          我试过了,它有效,不知道为什么如果

          从 [tableName] 中选择 [columnName] 其中 LENGTH(columnName)

          我猜任何用于转换数据的脚本都会在字段中留下一些东西,即使它显示为空白,这就是我对为什么 的猜测

          但是,如果您在该列字段中有任何其他值少于两个字符,那么您可能必须想出另一个解决方案。如果没有很多其他角色,那么您可以将它们单独列出。

          希望有一天我的解决方案可以帮助其他人。

          【讨论】:

            【解决方案10】:

            你也可以检查一下。这对我有用,当你想同时获取空值和另一个条件(即)我的查询应该返回列名应该为空的行并且应该有单词'questiontext'。

            SELECT * 
            FROM `table_name` 
            WHERE (('columnname' IS NULL) OR (TRIM('columnname') LIKE 'questiontext'))
            

            这里,我的 'columnname' 应该等于 'questiontext'。

            【讨论】:

              【解决方案11】:

              在 Oracle 中,您可以在 MySQL 中使用 NVL 函数,您可以使用 IFNULL(columnaName, newValue) 来达到您想要的结果,如本例所示

              SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';
              

              【讨论】:

                【解决方案12】:

                你可以使用

                SELECT [column_name] 
                FROM [table_name]
                WHERE [column_name] LIKE '% %' 
                OR [column_name] IS NULL
                

                【讨论】:

                • 这只是返回任何带有空格或NULL的记录
                猜你喜欢
                • 2013-03-26
                • 2023-01-28
                • 1970-01-01
                • 1970-01-01
                • 2010-12-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-04-19
                相关资源
                最近更新 更多