[英]MySQL select where column is not empty
在 MySQL 中,我可以只選擇存在某些內容的列嗎?
例如,我有以下查詢:
select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2
我正在嘗試僅選擇 phone 以 813 開頭且 phone2 中有內容的行。
將phone2
值與空字符串進行比較:
select phone, phone2
from jewishyellow.users
where phone like '813%' and phone2<>''
請注意, NULL
值被解釋為false
。
要檢查字段是否為 NULL 使用IS NULL
, IS NOT NULL
運算符。
MySql 參考http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
檢查NULL
和空字符串值:
select phone
, phone2
from users
where phone like '813%'
and trim(coalesce(phone2, '')) <>''
注意我認為 COALESCE() 是 SQL 標准(-ish),而 ISNULL() 不是。
我一直在使用的一個答案對我來說效果很好,我在這里還沒有看到(這個問題很老,所以當時可能沒有用)實際上是
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 > ''
注意> ''
部分,它將檢查該值是否為空,以及該值是否不僅僅是空白或空白。
基本上,如果該字段中有除空白或NULL
之外的其他內容,則為 true。 它也非常短,因此很容易編寫,而且COALESCE()
和IFNULL()
函數的另一個IFNULL()
是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 等),那么這完全沒問題,只是要小心數字。
如果 phone2 字段中有來自無意數據輸入的空格,您可以使用 IFNULL 和 TRIM 函數忽略這些記錄:
SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
AND TRIM(IFNULL(phone2,'')) <> '';
select phone, phone2 from jewishyellow.users
where phone like '813%' and phone2 is not null
SELECT phone, phone2
FROM jewishyellow.users
WHERE phone like '813%' and (phone2 <> "");
根據您的默認值,可能需要進行一些調整。 如果您允許 Null 填充,那么您可以改為使用“Not NULL”,這顯然更好。
另一種選擇是專門查看列值的CHAR_LENGTH
。 (不要與LENGTH
混淆)
使用字符長度大於 0 的標准將避免在列值可能為假時出現誤報,例如在整數列的值為0
或NULL
。 在不同的數據類型中表現得更一致。
這會導致任何長度至少為 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
令人驚訝的是(之前沒有其他人提到過)發現以下條件可以完成這項工作:
WHERE ORD(field_to_check) > 0
當我們需要排除空值和空值時。 有人知道這種方法的缺點嗎?
我們可以使用 CASE 將空白值設置為某些字符或字符串。 我使用 NA 作為默認字符串。
SELECT phone,
CASE WHEN phone2 = '' THEN 'NA' END AS phone2 ELSE ISNULL(phone2,0)
FROM jewishyellow.users WHERE phone LIKE '813%'
采用:
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 IS NOT NULL
您可以使用類似運算符通配符來實現此目的:
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 like '[0-9]';
通過這種方式,您可以獲得所有具有數字前綴的 phone2。
在我的情況下,我有一個 varchar 列,兩種方法IS NOT NULL
& != ''
都不起作用,但以下對我有用。 只是把這個放在這里。
SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.