MySQL选择列不为空


182

在MySQL中,是否可以仅在存在某些内容的地方选择列?

例如,我有以下查询:

select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2

我试图仅选择电话以813开头并且phone2中包含某些内容的行。


2
您能否阐明“其中phone2包含某些内容”的含义?人们正在猜测您的意思phone2是不是NOT NULL,不是空白,不是唯一的空格等
。– pilcrow

1
如果“某物”存在,则它显然不为空。
迈克,

Answers:


277

比较phone2空字符串的值:

select phone, phone2 
from jewishyellow.users 
where phone like '813%' and phone2<>''

请注意,NULL值解释为false


5
单引号,而不是双引号。
OMG Ponies,2009年

2
phone2<>""不会超过任何SQL语法检查器。
OMG Ponies,2009年

5
@OMG小马:但是它可以在mysql中工作。这是唯一重要的检查器
Ivan Nevostruev

7
@ivan:给我的消息,对此感到抱歉。
OMG小马

<>与!=相同。很简单。但我不知道:)
MFarooqi'5

48

要检查是否字段为空的使用IS NULLIS NOT NULL运营商。

MySql参考http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html


10
OP仅询问在phone2字段中包含某些内容的行。IS NOT NULL返回实际上不设置为NULL的所有内容,即使是空字符串“”。如Ivan在接受的答案中所说的!=''或<>''将不会返回空字符串或NULL值。换句话说,IS NOT NULL是!=''的子集,但它们不是等效的。

34

检查NULL并清空字符串值:

select phone
, phone2 
from users 
where phone like '813%' 
and trim(coalesce(phone2, '')) <>''

注意:我认为COALESCE()是SQL standard(-ish),而ISNULL()不是。


1
您不需要使用trim函数,因为在MySQL中,任意数量的空格字符串都等于另一个任意数量的空格字符串,我在相当详细的内容中对此做了书面回答stackoverflow.com/a/ 42723975/728236
Brian Leishman

25

实际上,我一直在使用的一个答案对我来说一直很好,在这里我还没有看到(这个问题很老,所以那时可能没有用)

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 > ''

请注意该> ''零件,它将检查值是否不为null,以及该值是否只是空白或空白。

基本上,如果该字段中包含空格或之外的其他内容NULL,则为true。它也非常短,因此很容易编写,而COALESCE()and IFNULL()函数的另一个优点是它是索引友好的,因为您没有将字段上函数的输出与任何东西进行比较。

测试用例:

SELECT if(NULL > '','true','false');-- false
SELECT if('' > '','true','false');-- false
SELECT if(' ' > '','true','false');-- false
SELECT if('\n' > '','true','false');-- false
SELECT if('\t' > '','true','false');-- false
SELECT if('Yeet' > '','true','false');-- true

更新我对此没想到,但零或以下的数值大于空白字符串,因此,如果要处理的数可以为零或负,则不要这样做,它最近咬了我,很难调试:(

如果您使用的是字符串(char,varchar,text等),那么这会很好,只需小心使用数字即可。


17

如果意外数据输入的phone2字段中有空格,则可以使用IFNULL和TRIM函数忽略这些记录:

SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
    AND TRIM(IFNULL(phone2,'')) <> '';

您不需要使用trim函数,因为在MySQL中,任意数量的空格字符串等于另一个任意数量的空格字符串,我在相当详细的内容中对此做了书面回答stackoverflow.com/a/ 42723975/728236
Brian Leishman

7
select phone, phone2 from jewishyellow.users 
where phone like '813%' and phone2 is not null

6
请注意,有一个之间的差异NULL值和一个空字符串''一个值。如果要检查是否为空字符串,请column <> ''按照其他答案的建议使用。
Dzhuneyt

7
SELECT phone, phone2 
FROM jewishyellow.users 
WHERE phone like '813%' and (phone2 <> "");

根据您的默认值,可能需要进行一些调整。如果允许Null填充,则可以改为执行“ Not NULL”,这显然更好。


我不会为您打分,但:1)NOT()MySQL中没有任何功能2)phone2=""不会使其超出任何SQL语法检查器。
OMG Ponies,2009年

1
嘿,对不起。我使用许多不同的SQL服务器。
Satanicpuppy

2

我们可以使用CASE将空白值设置为一些char或String。我使用NA作为默认字符串。

SELECT phone,   
CASE WHEN phone2 = '' THEN 'NA' END AS phone2 ELSE ISNULL(phone2,0) 
FROM jewishyellow.users  WHERE phone LIKE '813%'

2

另一种选择是专门查看CHAR_LENGTH列值的。(不要与混淆LENGTH

使用字符长度大于0的条件时,当列值可能为false时(例如,整数列的值为0或),将避免误报NULL。在各种数据类型上的表现更加一致。

这将导致任何值的长度至少为1个字符,否则为非空。

范例 https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1

SELECT phone, phone2
FROM users
WHERE phone LIKE '813%'
AND CHAR_LENGTH(phone2) > 0

表数据

users
phone (varchar 12) | phone2 (int 10)
"813-123-4567"     | NULL
"813-123-4567"     | 1
"813-123-4567"     | 0

users2
phone (varchar 12) | phone2 (varchar 12)
"813-123-4567"     | NULL
"813-123-4567"     | "1"
"813-123-4567"     | "0"
"813-123-4567"     | ""

CHAR_LENGTH(phone2) > 0结果(相同)

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

备择方案

phone2 <> ''结果(不同)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 > ''结果 (不同)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

COALESCE(phone2, '') <> ''结果(相同)
注意:结果与phone2 IS NOT NULL AND phone2 <> ''预期的结果有所不同

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 IS NOT NULL AND phone2 <> ''结果(不同)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

2

出乎意料的是(正如之前没有人提到的那样)发现以下条件可以完成工作:

WHERE ORD(field_to_check) > 0 

当我们需要同时排除null和空值时。有人知道这种方法的弊端吗?


香港专业教育学院一直试图使语法正确,这只是解决了一切谢谢!
demo7up

1

用:

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 IS NOT NULL

1
我注意到有时有时IS NOT NULL不适用于仅字符串为空值('')的列。我不知道为什么,但只想指出一点。t.phone2 <> ''检查空字符串列时使用是更明智的。
Dzhuneyt

0

您可以使用类似运算符通配符来实现此目的:

SELECT t.phone, 
       t.phone2 
FROM jewishyellow.users t
WHERE t.phone LIKE '813%' 
  AND t.phone2 like '[0-9]';

这样,您可以获得具有数字前缀的所有phone2。


0

在我的情况下,我有一个varchar列,IS NOT NULL&的两种方法都!= '' 不起作用,但是以下方法对我有用。只是把这个放在这里。

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
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.