MySQL เลือกตำแหน่งที่คอลัมน์ไม่ว่าง


182

ใน MySQL ฉันสามารถเลือกคอลัมน์ที่มีบางสิ่งได้หรือไม่

ตัวอย่างเช่นฉันมีคำถามต่อไปนี้:

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

ฉันกำลังพยายามเลือกเฉพาะแถวที่โทรศัพท์ขึ้นต้นด้วย 813 และ phone2 มีบางอย่างในนั้น


2
คุณสามารถอธิบายสิ่งที่คุณหมายถึงโดย " phone2มีบางอย่างในมันได้หรือไม่" ผู้คนต่างคาดเดากันว่าคุณหมายถึงphone2IS NOT NULL, ไม่ว่างเปล่า, ไม่ใช่ช่องว่างพิเศษ ฯลฯ
pilcrow

1
หาก "บางสิ่ง" มีอยู่ก็คงไม่เป็นโมฆะ
ไมค์

คำตอบ:


277

เปรียบเทียบค่าของphone2กับสตริงว่าง:

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

โปรดทราบว่าค่าถูกตีความว่าเป็นNULLfalse


5
เครื่องหมายคำพูดเดี่ยวไม่ใช่เครื่องหมายคำพูดคู่
OMG Ponies

2
phone2<>""จะไม่ผ่านตัวตรวจสอบไวยากรณ์ SQL ใด ๆ
OMG Ponies

5
@OMG Ponies: แต่มันทำงานได้ใน mysql นี่เป็นตัวตรวจสอบเดียวที่สำคัญ
Ivan Nevostruev

7
@ivan: ขอโทษด้วยนะ
OMG Ponies

<> เหมือนกับ! = มันง่าย แต่ฉันไม่รู้ :)
MFarooqi

48

เพื่อตรวจสอบว่าข้อมูลคือการใช้โมฆะIS NULL, IS 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, '')) <>''

NB ฉันคิดว่า COALESCE () เป็นมาตรฐาน SQL (-ish) ในขณะที่ ISNULL () ไม่ใช่


1
คุณไม่จำเป็นต้องใช้ฟังก์ชั่นการตัดแต่งเนื่องจากใน MySQL สตริงของจำนวนช่องว่างใด ๆ จะเท่ากับสตริงอื่นของช่องว่างใด ๆ ฉันได้เขียนคำตอบไว้ในรายละเอียดstackoverflow.com/a/ 42723975/728236
Brian Leishman

26

คำตอบที่ฉันใช้อยู่ซึ่งใช้งานได้ดีสำหรับฉันค่อนข้างดีที่ฉันไม่ได้เห็นที่นี่ (คำถามนี้เก่ามากดังนั้นจึงอาจไม่ได้ผล)

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

UPDATEมีข้อแม้นี้ว่าผมไม่ได้คาดหวัง แต่ค่าตัวเลขที่มีศูนย์หรือด้านล่างนี้คือไม่มากกว่าสตริงว่างเปล่าดังนั้นถ้าคุณกำลังจัดการกับตัวเลขที่สามารถลบหรือเป็นศูนย์แล้วไม่ทำเช่นนี้ , มันกัดฉันเร็ว ๆ นี้และเป็นเรื่องยากมากที่จะแก้ปัญหา :(

หากคุณกำลังใช้สตริง (อักขระ, อักขระ, ข้อความ ฯลฯ ) สิ่งนี้จะสมบูรณ์แบบได้อย่างดีเพียงระวังตัวเลข


17

หากมีช่องว่างในฟิลด์ phone2 จากการป้อนข้อมูลโดยไม่ตั้งใจคุณสามารถละเว้นระเบียนเหล่านั้นด้วยฟังก์ชัน IFNULL และ TRIM:

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

คุณไม่จำเป็นต้องใช้ฟังก์ชั่นการตัดแต่งเนื่องจากใน 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

1
เฮ้ขอโทษ ฉันใช้เซิร์ฟเวอร์ SQL ที่แตกต่างกันมากมาย
Satanicpuppy

2

เราสามารถใช้ CASE เพื่อตั้งค่าว่างเป็นถ่านหรือสตริง ฉันใช้ 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 จะหลีกเลี่ยงการบวกเท็จเมื่อค่าของคอลัมน์สามารถ falsey เช่นในกรณีของคอลัมน์จำนวนเต็มมีค่าของหรือ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 '%*%'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.