如何检查 MySQL 中的列是不是为空或 null?

Posted

技术标签:

【中文标题】如何检查 MySQL 中的列是不是为空或 null?【英文标题】: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 【参考方案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 =  '' 

请参阅TRIMCOALESCE 和IS 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 :-

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

这些修剪函数的语法是:

    使用Trim进行检查-

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

    使用 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, '') = '';

【讨论】:

以上是关于如何检查 MySQL 中的列是不是为空或 null?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 ViewBag 属性是不是为空或不存在

检查列表是不是为空或 null 颤动

检查所有三列是不是不为空或为空

如何检查数据读取器是不是为空或为空

检查对象中的值是不是为空或空javascript

如何在 iOS 中检查 NSArray 是不是为空或为空?