【问题标题】:How do I check if a column is empty or null in MySQL?如何检查 MySQL 中的列是否为空或 null?
【发布时间】:2012-01-18 05:45:54
【问题描述】:

我在表中有一个列,其中可能包含空值或空值。如何检查表中存在的行中的列是否为空或 null?

(e.g. null or '' or '  ' or '      ' and ...)

【问题讨论】:

  • MySQL 代码:如果 mycolumn 为空,select isnull(mycolumn) from mytable 返回 1。
  • length(trim(mycolumn)) > 0 怎么样?
  • 对于 MSSQL > WHERE COLUMN '' OR WHERE LEN(COLUMN) > 0 OR WHERE NULLIF(LTRIM(RTRIM(COLUMN)), '') 不是 NULL

标签: mysql sql


【解决方案1】:

您可以使用WHERE col IS NULLWHERE col IS NOT NULL 例如测试列是否为空

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

在您的示例中,您有各种空白排列。您可以使用TRIM 去除空白,也可以使用COALESCE 将默认值设为NULL(COALESCE 将返回您提供的值中的第一个非空值。

例如

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '')) = '' 

此最终查询将返回 MyCol 为 null 或任何长度的空格的行。

如果可以避免,最好不要在 WHERE 子句中的列上使用函数,因为这会使使用索引变得困难。如果您只是想检查一列是否为空或为空,您最好这样做:

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

请参阅TRIMCOALESCEIS NULL 了解更多信息。

还有来自 MySQL 文档的 Working with null values

【讨论】:

  • 您以非常复杂的方式呈现真正的解决方案。首先,您对他的问题“mycol 为空”提出了一个不完整的解决方案。然后,您在 where 子句中使用两个嵌套函数提出了一个解决方案,即使说应该避免这种情况。只有这样你才能找到真正的解决方案。将来,首先提出您真正的解决方案。
【解决方案2】:

如果您希望在执行 ORDER BY 时最后显示 NULL 值,请尝试以下操作:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;

【讨论】:

    【解决方案3】:

    试试

    SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL
    
    -> 0, 0, 1
    

    SELECT ISNULL('  ') , ISNULL( NULL )
     -> 0 ,1
    

    Reference

    【讨论】:

      【解决方案4】:

      检查是否为空

      $column is null
      isnull($column)
      

      检查是否为空

      $column != ""
      

      但是,您应该始终为列设置 NOT NULL,
      mysql optimization can handle only one IS NULL level

      【讨论】:

      • 从不接受NULL 值是另一个完整的讨论主题。我认为不提供您的理由就提出该建议是不合适的。
      • 我确实包括在内,请耐心等待。加上使用 NULL 真的很难(就像这个问题一样)。
      • 这是一个糟糕的建议。在插入时其值可能未知的列上设置 NOT NULL 仅用于鼓励使用非标准“null”值,例如 -1''
      • @Dan 如果您不确定插入过程中的值是多少,您可能难以进行任何可能的优化
      【解决方案5】:

      这将选择some_colNULL''(空字符串)的所有行

      SELECT * FROM table WHERE some_col IS NULL OR some_col = '';
      

      【讨论】:

      • 如果您将条件更改为WHERE some_col IS NULL OR some_col = ' '(在字符串中插入一个空格),那么它适用于 MySQL 和 Oracle,请参阅“onedaywhen”的答案。 some_col = '' 在 Oracle 上不起作用,因为空字符串在那里表示 NULL。
      • @Johanna 但是如果你切换到' ',那么它在 SQLite 中将不起作用。它只处理相同/直接的字符串匹配。
      【解决方案6】:

      根据 SQL-92 标准的定义,当比较两个不同宽度的字符串时,较窄的值会在右边用空格填充,以使其与较宽的值具有相同的宽度。因此,所有完全由空格(包括零空格)组成的字符串值将被视为相等,例如

      '' = ' ' IS TRUE
      '' = '  ' IS TRUE
      ' ' = '  ' IS TRUE
      '  ' = '      ' IS TRUE
      etc
      

      因此,无论some_col 值有多少个空格,这都应该有效:

      SELECT * 
        FROM T
       WHERE some_col IS NULL 
             OR some_col = ' ';
      

      或更简洁:

      SELECT * 
        FROM T
       WHERE NULLIF(some_col, ' ') IS NULL;
      

      【讨论】:

      • 感谢您提及填充空间。您可以从中获利并将条件更改为WHERE some_col IS NULL OR some_col = ' '(在字符串中插入一个空格),然后它适用于 MySQL 和 Oracle。 some_col = '' 在 Oracle 上不起作用,因为空字符串在此处表示 NULL,并且完整条件变为 NULL。
      • 我的要求是找到在 MySQL 中为我工作的 SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;。希望这会有用。
      • 实际上 '' = ' ' 在 SQLServer 中有效,但在 SQLite 中无效,据我所知,从现在测试来看。
      【解决方案7】:

      写条件的更短方式:

      WHERE some_col > ''
      

      由于null > '' 产生unknown,这具有过滤掉null 和空字符串的效果。

      【讨论】:

      • 有没有办法获得相反的结果,获取所有为 NULL 或空字符串的记录?
      • @JoshPinter: coalesce(some_col, '') = ''
      • 这在某些时候可能是正确的,但在 MySQL 14.14 中不起作用。
      • 效果很好,实际上是我弄清楚如何过滤掉 MariaDB 中的空字段和空字段的唯一方法
      • 我用 some_col '' 来找到它的反面
      【解决方案8】:

      我讨厌数据库中杂乱的字段。如果该列可能是空白字符串或 null,我宁愿在每次进行选择之前修复此问题,如下所示:

      UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
      SELECT * FROM MyTable WHERE MyColumn IS NULL
      

      这可以保持数据整洁,只要您出于某种原因不需要特别区分 NULL 和空即可。

      【讨论】:

      • 一次性修复很有趣。或偶尔的维护操作。但是当数据库处于活动状态时它是不切实际的 - UPDATE 必须锁定表(以保持一致性)。如果其他人需要访问同一张表,那将降低性能。然后不能保证其他人不会在 UPDATE 完成后立即创建包含空白的记录。这是一个滑坡。
      【解决方案9】:

      没有WHERE的另一种方法,试试这个..

      将同时选择 Empty 和 NULL 值

      SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename
      

      【讨论】:

      • 如果有 null 则返回 1,为什么会这样?
      • NULLIF 检查字段名是否为空值,如果为空则转换为 NULL。如果 NULLIF 成功地将一个空字段更改为 NULL 或者它已经是 NULL,则 ISNULL 返回 1(真)......尝试使用两个函数分隔的表中的一个空字段和空字段为您自己选择 isnull (X) , 选择 nullif(y)
      【解决方案10】:

      这句话对我来说更清晰,更易读:

      select * from my_table where ISNULL(NULLIF(some_col, ''));
      

      【讨论】:

        【解决方案11】:

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

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

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

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

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

        如何检查 Empty/Null :-

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

        这些修剪函数的语法是:

        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

        希望对您有所帮助:)

        【讨论】:

          【解决方案12】:

          如果数据类型为字符串且行为空,请尝试此操作

          SELECT * FROM table WHERE column_name IS NULL OR column_name = ''
          

          如果数据类型是 int 或列是 0,那么试试这个

          SELECT * FROM table WHERE column_name > = 0
          

          【讨论】:

            【解决方案13】:
            SELECT column_name FROM table_name WHERE column_name IN (NULL, '')
            

            【讨论】:

            • 错误答案。这不会选择NULL
            • 澄清@Pang 的评论:不能在表达式中使用NULL,就好像它是一个值一样。您必须进行特殊测试,例如 ... IS NULLISNULL(...) 请注意,代码示例永远不会说 column_name = NULL。它只是不那样工作。
            【解决方案14】:

            要么

            SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename
            

            SELECT case when field1 IS NULL or field1 = ''
                    then 'empty'
                    else field1
               end as field1 from tablename
            

            【讨论】:

              【解决方案15】:

              你也可以这样做

              SELECT * FROM table WHERE column_name LIKE ''
              

              倒数

              SELECT * FROM table WHERE column_name NOT LIKE ''
              

              【讨论】:

              • 显然不起作用:select NULL like '' 返回NULL - 至少在 MySQL 中。
              • 性能:不要将LIKE 用于没有它也可以完成的表达式。
              【解决方案16】:
              select * from table where length(RTRIM(LTRIM(column_name))) > 0
              

              【讨论】:

              • 同时使用RTRIMLTRIM 而不使用TRIM 有什么意义?
              • 我觉得它很有趣,但不推荐;) - 占用了太多资源/时间。
              【解决方案17】:
              SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';
              

              【讨论】:

              • 与有时为空的字段相比,我遇到了问题。这有帮助:col1 != IFNULL(col2,'')
              • FWIW:字符串不可能小于空字符串,因此可以使用&lt;&gt;代替&gt;
              • 我发现使用 TRIM 比 '' 等使用更多资源(需要更多时间)。当然,如果没有必要,虽然它正在工作,但不要使用它。
              【解决方案18】:

              在我的例子中,在数据导入期间在列中输入了空格,虽然它看起来像一个空列,但它的长度是 1。所以首先我使用 length(column) 检查了空列的长度,然后基于这个我们可以写搜索查询

              从 LENGHT(COLUMN)= 0 的表中选择 *;

              【讨论】:

              • 嗯?我不明白那个代码 sn-p 说什么。你是想说LENGTH(column)=0吗?
              【解决方案19】:

              获取NULL, 0, '', ' ', ' '的行

                  SELECT * FROM table WHERE some_col IS NOT TRUE;
              

              获取不带NULL、0、''、''、''的行

                  SELECT * FROM table WHERE some_col IS TRUE;
              

              【讨论】:

              • 我认为这行不通。 SELECT 'abc' &lt;&gt; '', 'abc' IS TRUE; 返回 10
              【解决方案20】:

              我的两分钱。

              在 MySQL 中你可以使用COALESCE 函数:

              返回列表中的第一个非 NULL 值,如果没有非 NULL 值,则返回 NULL。

              所以你可以像这样简化你的查询:

              SELECT * FROM table WHERE COALESCE(some_col, '') = '';
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-03-16
                • 2021-11-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-06-11
                • 1970-01-01
                相关资源
                最近更新 更多