簡體   English   中英

MySQL選擇其中列不為空的地方

[英]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 NULLIS 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 的標准將避免在列值可能為假時出現誤報,例如在整數列的值為0NULL 在不同的數據類型中表現得更一致。

這會導致任何長度至少為 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

令人驚訝的是(之前沒有其他人提到過)發現以下條件可以完成這項工作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM