在MySQL,我可以选择列只存在的东西吗?

例如,我有以下查询:

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

我试图只选择电话以813开始的行,电话2有一些东西在里面。


当前回答

令人惊讶的是(之前没有人提到过),我们发现下面的条件可以起作用:

WHERE ORD(field_to_check) > 0 

当我们需要排除空值和空值时。 有人知道这种方法的缺点吗?

其他回答

在我的情况下,我有一个varchar列,两个方法的IS NOT NULL & != "没有工作,但以下工作为我。把这个写出来。

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'

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

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

另一种替代方法是专门查看列值的CHAR_LENGTH。(不要与长度混淆)

使用字符长度大于0的条件,可以避免在列值可能为假时出现误报,例如在整数列的值为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

结果(不同)

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

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

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

比较phone2的值和空字符串:

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

注意,NULL值被解释为false。