如何检查MySQL中的列为空还是空?


288

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

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

1
MySQL代码:select isnull(mycolumn) from mytable如果mycolumn为null,则返回1。
Eric Leschinski 2014年

2
那么length(trim(mycolumn))> 0呢?
西里尔·提花

对于MSSQL> WHERE COLUMN <>''或WHERE LEN(COLUMN)> 0或WHERE NULLIF(LTRIM(RTRIM(COLUMN)),'')不为空
DxTx

Answers:


443

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

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

7
如果将条件更改为WHERE some_col IS NULL OR some_col = ' '(在字符串中插入一个空格),则它在MySQL和Oracle上均适用,请参见“ onedaywhen”的答案。some_col = ''在Oracle上不起作用,因为空字符串表示NULL。
约翰娜

1
@Johanna,但是如果您切换到' ',那么它将无法在SQLite中使用。它仅处理相同/直接的字符串匹配。
Magne

131

根据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;

6
感谢您提及填充空间。您可以从中受益,并将条件更改为WHERE some_col IS NULL OR some_col = ' '(在字符串中插入一个空格),然后它就可以在MySQL和Oracle上使用。some_col = ''在Oracle上不起作用,因为空字符串在那里表示NULL,并且完整条件变为NULL。
约翰娜

我的要求是找到SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;在MySQL中为我工作。希望这会有用。
Dinuka Dayarathna

其实'' = ' '工作在SQLServer的但不是在SQLite的,据我所知,从现在开始测试它。
Magne

66

编写条件的较短方法:

WHERE some_col > ''

由于null > ''产生了unknown,这具有过滤掉null空字符串的作用。


2
有没有办法解决这个问题,获取所有记录为NULL或空字符串的记录?
约书亚·品特

14
@JoshPinter:coalesce(some_col, '') = ''
Andomar 2014年

6
有时候可能是这样,但在MySQL 14.14中不起作用。
GunnarÞórMagnússon16年

效果很好,实际上是我可以找出如何过滤MariaDB中的空字段和空字段的唯一方法
Neal Davis

1
我使用some_col <>''找到了相反的结果
Chargnn19年

18

您可以使用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, '') = '' 

此最终查询将返回MyColnull或空白的任意长度的行。

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

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

有关更多信息,请参见TRIM COALESCEIS NULL

还可以使用 MySQL文档中的空值


2
您以一种非常复杂的方式介绍了真正的解决方案。首先,您为他的问题“ mycol为空”提出了一个不完整的解决方案。然后,您将在where子句中使用两个嵌套函数提供解决方案,即使说这是应该避免的。只有这样,您才能找到真正的解决方案。将来,请先提出您的实际解决方案。

在第二个示例中)=符号前缺少a
Rorrim

15

没有WHERE的另一种方法,请尝试此。

将同时选择Empty和NULL值

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

如果存在null,则返回1,为什么呢?
noobie-php

NULLIF检查字段名是否为空值,如果为空,则将其转换为NULL。如果NULLIF成功地将一个空字段更改为NULL或如果它已经为NULL,则ISNULL返回1(true)。 ,请选择nullif(y)
PodTech.io

9

要么

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

6

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

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

只要您出于某种原因特别不需要在NULL和空之间进行区分,就可以使数据保持整洁。


5

尝试

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

-> 0, 0, 1

要么

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

参考


5

这句话对我来说更简洁,更易读:

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

4

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

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

以下是仅用于了解不同数据库支持的方法的矩阵。

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

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • 甲骨文: RTRIM(), LTRIM()
  • SQL Server: RTRIM(), LTRIM()

如何检查空/空:-

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

这些修剪函数的语法为:

  1. 使用修剪检查-

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

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

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

以上两种方式都可以提供相同的结果,只是基于您的数据库支持而使用。它只是返回FirstNameUserDetails如果它为空 from 表LastName

希望这对您有帮助:)


3

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

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

3

你也可以

SELECT * FROM table WHERE column_name LIKE ''

反之

SELECT * FROM table WHERE column_name NOT LIKE ''

显然不起作用:select NULL like ''返回NULL-至少在MySQL中。
泰特斯(Titus),


1

检查是否为空

$column is null
isnull($column)

检查是否为空

$column != ""

但是,您应该始终为列设置NOT NULL,
mysql优化只能处理一个IS NULL级别


3
永不接受NULL价值观是另一个需要讨论的话题。我认为不提供您的理由就不建议这样做。
maček

我确实包括耐心等待。加号使用NULL确实会使生活变得困难(就像这个问题一样)。
2011年

5
这是一个可怕的建议。在INSERT时可能不知道其值的列上设置NOT NULL仅用于鼓励使用诸如-1和的非标准“ null”值''
Dan Bechard

@Dan如果不确定插入过程中的值是什么,则可能无法进行任何优化
ajreal 2014年


0

在我的情况下,在数据导入期间在该列中输入了空格,尽管它看起来像一个空列,其长度为1。所以首先我使用来检查该空列的长度,length(column)然后基于此我们可以编写搜索查询

SELECT * FROM TABLE WHERE LENGHT(COLUMN)=空列的列长


-1

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

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

如果数据类型为int或column为0,则尝试此操作

SELECT * FROM table WHERE column_name > = 0

-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')

1
错误的答案。这不会选择NULL
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.