如何在mysql中检查列是空还是空

pri*_*iya 268 mysql sql

我在表中有一列可能包含null或空值.如何在表中存在的行中检查列是空还是空.

(e.g. null or '' or '  ' or '      ' and ...)
Run Code Online (Sandbox Code Playgroud)

mač*_*ček 409

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

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';
Run Code Online (Sandbox Code Playgroud)

  • 如果您将条件更改为`WHERE some_col IS NULL或some_col =''`(在字符串中插入一个空格),那么它适用于MySQL和Oracle,请参阅"onedaywhen"的答案.`some_col =''`不适用于Oracle,因为空字符串表示NULL. (5认同)
  • @Johanna,但是如果你切换到“”,那么它在 SQLite 中将不起作用。它仅处理相同/直接字符串匹配。 (2认同)

one*_*hen 127

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

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc
Run Code Online (Sandbox Code Playgroud)

因此,无论构成该some_col值的空间有多少,这都应该有效:

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';
Run Code Online (Sandbox Code Playgroud)

或者更简洁:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你提到填充空间.您可以利用它们并将条件更改为`WHERE some_col IS NULL或some_col =''`(在字符串中插入一个空格)然后它可以在MySQL和Oracle上运行.`some_col =''`不适用于Oracle,因为空字符串表示NULL,完整条件变为NULL. (6认同)

And*_*mar 60

写条件的简短方法:

WHERE some_col > ''
Run Code Online (Sandbox Code Playgroud)

null > ''生成以来unknown,这具有过滤掉null空字符串和空字符串的效果.

  • @JoshPinter:`coalesce(some_col,'')=''` (12认同)
  • 这可能在某个时候是真的,但在MySQL 14.14中不起作用. (6认同)
  • 有没有办法得到相反的结果,获取所有记录,其中它是NULL或空字符串? (2认同)
  • 我使用 some_col <> '' 来查找相反的内容 (2认同)

Cod*_*ian 15

您可以测试一个列是否为空或使用不为空WHERE col IS NULLWHERE col IS NOT NULL

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您有各种各样的白色空间排列.您可以使用剥离空格,TRIM并且可以使用COALESCE默认值NULL(COALESCE将从您提供的值返回第一个非空值.

例如

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '') = '' 
Run Code Online (Sandbox Code Playgroud)

此最终查询将返回行为MyColnull或任何长度的空格.

如果你可以避免它,最好不要在WHERE子句中的列上有一个函数,因为它很难使用索引.如果您只想检查列是空还是空,那么最好这样做:

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅TRIM COALESCEIS NULL.

使用 MySQL文档中的空值

  • 您以非常复杂的方式呈现真正的解决方案.首先,你提出了一个不完整的解决方案,他的问题是"mycol为null".然后在where子句中使用两个嵌套函数提出解决方案,即使这样说也应该避免.只有这样才能找到真正的解决方案.在未来,首先提出您真正的解决方案. (2认同)

Pod*_*.io 13

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

将同时选择Empty和NULL值

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename
Run Code Online (Sandbox Code Playgroud)


Rey*_*tol 9

要么

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename
Run Code Online (Sandbox Code Playgroud)

要么

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename
Run Code Online (Sandbox Code Playgroud)


diE*_*cho 6

尝试

SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL

-> 0, 0, 1
Run Code Online (Sandbox Code Playgroud)

要么

SELECT ISNULL('  ') , ISNULL( NULL )
 -> 0 ,1
Run Code Online (Sandbox Code Playgroud)

参考


小智 6

我讨厌数据库中的杂乱字段.如果列可能是空字符串或null,我宁愿在每次执行select之前修复它,如下所示:

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL
Run Code Online (Sandbox Code Playgroud)

这样可以保持数据整洁,只要您不需要因某种原因明确区分NULL和空.


Ama*_*nut 6

这条语句对我来说更清晰、更易读:

select * from my_table where ISNULL(NULLIF(some_col, ''));
Run Code Online (Sandbox Code Playgroud)


Pio*_*ioz 6

我的两分钱。

在 MySQL 中,您可以使用以下COALESCE函数:

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

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

SELECT * FROM table WHERE COALESCE(some_col, '') = '';
Run Code Online (Sandbox Code Playgroud)


Vik*_*dey 5

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

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

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

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

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • 甲骨文: RTRIM(), LTRIM()
  • SQL服务器: 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

以上两种方式提供相同的结果,只需根据您的数据库支持使用即可。如果它有空,它只返回FirstNamefrom表UserDetailsLastName

希望这会对您有所帮助:)