MySQL选择列不为空的位置

时间:2009-12-08 19:27:42

标签: sql mysql

在MySQL中,我可以只在存在某些内容时选择列吗?

例如,我有以下查询:

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

我正在尝试仅选择手机以813开头的行,而phone2中有内容。

13 个答案:

答案 0 :(得分:251)

phone2的值与空字符串进行比较:

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

请注意,NULL值被解释为false

答案 1 :(得分:46)

要检查字段是否为NULL,请使用IS NULLIS NOT NULL运算符。

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

答案 2 :(得分:30)

检查NULL并清空字符串值:

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

N.B。我认为COALESCE()是SQL标准(-ish),而ISNULL()不是。

答案 3 :(得分:15)

如果手机2字段中存在空间而无意中输入数据,您可以忽略具有IFNULL和TRIM功能的记录:

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

答案 4 :(得分:15)

我一直在使用的答案一直很适合我,我在这里没有看到(这个问题已经很老了,所以它可能还没有用)实际上是

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

注意> ''部分,它将检查该值是否为空,以及该值是否只是空格或空白。

基本上,如果字段中除了空格或NULL之外还有其他内容,则确实如此。它也是超短的,因此它很容易编写,而COALESCE()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等),那么这将完全没问题,只需要注意数字。

答案 5 :(得分:7)

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

答案 6 :(得分:5)

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

可能需要一些调整,具体取决于您的默认值。如果你允许Null填充,那么你可以改为“Not NULL”,这显然更好。

答案 7 :(得分: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%'

答案 8 :(得分:1)

使用:

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

答案 9 :(得分:0)

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

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

通过这种方式,您可以获得所有带有数字前缀的phone2。

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

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

哪个值的长度至少为1个字符,否则为非空。

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

NULL

表数据

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 <> ''

答案 12 :(得分:0)

令人惊讶的是(正如之前没有人提到的那样)发现以下条件可以完成工作:

WHERE ORD(field_to_check) > 0 

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