ฉันจะตรวจสอบได้อย่างไรว่าคอลัมน์ว่างเปล่าหรือไม่ว่างใน MySQL?


288

ฉันมีคอลัมน์ในตารางซึ่งอาจมีค่า Null หรือค่าว่าง ฉันจะตรวจสอบได้อย่างไรว่าคอลัมน์ว่างเปล่าหรือเป็นโมฆะในแถวที่อยู่ในตาราง

(e.g. null or '' or '  ' or '      ' and ...)

1
รหัส MySQL: select isnull(mycolumn) from mytableส่งคืน 1 ถ้า mycolumn เป็นโมฆะ
Eric Leschinski

2
แล้วความยาว (trim (mycolumn))> 0?
Cyril Jacquart

สำหรับ MSSQL> WHERE COLUMN <> '' หรือ LEN LEN (COLUMN)> 0 หรือ WHERE NULLIF (LTRIM (RTRIM (COLTRN)), '') ไม่เป็น
Nx

คำตอบ:


445

สิ่งนี้จะเลือกแถวทั้งหมดที่some_colมีNULLหรือ''(สตริงว่าง)

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';

7
หากคุณเปลี่ยนเงื่อนไขเป็นWHERE some_col IS NULL OR some_col = ' '(หนึ่งช่องว่างใส่ในสตริง) แสดงว่าทำงานได้ทั้งใน MySQL และ Oracle โปรดดูคำตอบของ "onedaywhen" some_col = ''ไม่ทำงานบน Oracle เนื่องจากสตริงว่างหมายถึง NULL ตรงนั้น
Johanna

1
@ Johanna แต่ถ้าคุณเปลี่ยนไป' 'มันจะไม่ทำงานใน SQLite มันจัดการการจับคู่สตริงที่เหมือนกัน / โดยตรงเท่านั้น
Magne

131

ตามที่กำหนดโดยมาตรฐาน SQL-92 เมื่อเปรียบเทียบสองสายอักขระของความกว้างที่แตกต่างกันค่าที่แคบกว่าจะถูกเสริมด้วยพื้นที่ด้านขวาเพื่อให้มีความกว้างเท่ากับค่าที่กว้างขึ้น ดังนั้นค่าสตริงทั้งหมดที่มีช่องว่างทั้งหมด (รวมถึงช่องว่างศูนย์) จะถือว่าเท่ากันเช่น

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

ดังนั้นสิ่งนี้จึงทำงานได้โดยไม่คำนึงถึงจำนวนช่องว่างที่สร้างsome_colมูลค่า:

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

หรือมากกว่ารัดกุม:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;

6
ขอบคุณที่กล่าวถึงช่องว่างที่บุนวม คุณสามารถหากำไรของพวกเขาและเปลี่ยนเงื่อนไขเป็นWHERE some_col IS NULL OR some_col = ' '(หนึ่งช่องว่างในสตริง) แล้วมันทำงานได้ทั้งใน MySQL และ Oracle some_col = ''ไม่ทำงานบน Oracle เนื่องจากสตริงว่างหมายถึง NULL ตรงนั้นและเงื่อนไขทั้งหมดกลายเป็น NULL
Johanna

ความต้องการของฉันคือการค้นหาSELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; และSELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;ทำงานให้ฉันใน MySQL หวังว่านี่จะเป็นประโยชน์
Dinuka Dayarathna

ใช้'' = ' 'งานได้จริงใน SQLServer แต่ไม่ใช่ใน SQLite เท่าที่ฉันสามารถบอกได้จากการทดสอบตอนนี้
Magne

66

วิธีที่สั้นกว่าในการเขียนเงื่อนไข:

WHERE some_col > ''

ตั้งแต่null > ''ผลิตunknownสิ่งนี้มีผลในการกรองทั้งnullสตริงและว่างเปล่า


2
มีวิธีรับกลับนี้รับระเบียนทั้งหมดที่เป็น NULL หรือสตริงว่างหรือไม่
Joshua Pinter

14
@JoshPinter:coalesce(some_col, '') = ''
Andomar

6
สิ่งนี้อาจเป็นจริงในบางครั้ง แต่ไม่ทำงานใน MySQL 14.14
Gunnar ÞórMagnússon

ใช้งานได้ดีและในความเป็นจริงเป็นวิธีเดียวที่ฉันสามารถหาวิธีกรองทั้งฟิลด์ว่างและว่างใน MariaDB
Neal Davis

1
ฉันใช้ some_col <> '' เพื่อค้นหาสิ่งที่ตรงกันข้าม
Chargnn

18

คุณสามารถทดสอบว่าคอลัมน์เป็นโมฆะหรือไม่โมฆะใช้WHERE col IS NULLหรือWHERE col IS NOT NULLเช่น

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

ในตัวอย่างของคุณคุณมีการเรียงสับเปลี่ยนของพื้นที่สีขาว คุณสามารถดึงพื้นที่สีขาวโดยใช้TRIMและคุณสามารถใช้COALESCEเพื่อเริ่มต้นค่า NULL (COALESCE จะส่งกลับค่าที่ไม่ใช่ศูนย์แรกจากค่าที่คุณคิด

เช่น

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '') = '' 

แบบสอบถามสุดท้ายนี้จะส่งคืนแถวที่MyColเป็นโมฆะหรือมีความยาวของช่องว่างใด ๆ

หากคุณสามารถหลีกเลี่ยงได้มันจะดีกว่าหากไม่มีฟังก์ชั่นในคอลัมน์ในส่วนคำสั่ง WHERE เนื่องจากจะทำให้ใช้ดัชนีได้ยาก หากคุณต้องการตรวจสอบว่าคอลัมน์ว่างหรือเปล่าคุณอาจทำสิ่งนี้ได้ดีกว่า:

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

ดูTRIM COALESCEและNULLสำหรับข้อมูลเพิ่มเติม

นอกจากนี้การทำงานกับค่า nullจากเอกสารข้อมูล MySQL


2
คุณนำเสนอทางออกที่แท้จริงด้วยวิธีที่ซับซ้อนมาก ขั้นแรกคุณต้องนำเสนอวิธีแก้ปัญหาของเขาที่ไม่สมบูรณ์ "โดยที่ mycol เป็นโมฆะ" จากนั้นคุณนำเสนอวิธีการแก้ปัญหาโดยใช้สองฟังก์ชั่นที่ซ้อนกันในข้อที่แม้ในขณะที่พูดนี้ควรหลีกเลี่ยง จากนั้นคุณจะได้ทางออกที่แท้จริง ในอนาคตนำเสนอทางออกที่แท้จริงของคุณก่อน

ไม่มี a )ก่อนหน้า=เครื่องหมายในตัวอย่างที่สองของคุณ
Rorrim

15

วิธีอื่นโดยที่ไม่ลองนี้ ..

จะเลือกทั้งค่าว่างและค่า NULL

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename

สิ่งนี้ส่งคืน 1 หากมีบางสิ่งที่เป็นโมฆะเหตุใดจึงเป็นเช่นนั้น
noobie-php

NULLIF ตรวจสอบชื่อฟิลด์สำหรับค่าว่างและจะแปลงเป็น NULL หากว่างเปล่า ISNULL ส่งคืน 1 (จริง) ถ้า NULLIF เปลี่ยนฟิลด์ว่างเป็น NULL สำเร็จหรือถ้ามันเป็น NULL อยู่แล้ว .... ลองใช้ตัวคุณเองในช่องว่างและว่างในตารางที่มีฟังก์ชั่นสองรายการแยก isnull (X) เลือก nullif (y)
PodTech.io

9

ทั้ง

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

หรือ

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename

6

ฉันเกลียดเขตข้อมูลยุ่งในฐานข้อมูลของฉัน หากคอลัมน์อาจเป็นสตริงว่างหรือโมฆะฉันควรแก้ไขก่อนที่จะทำการเลือกในแต่ละครั้งเช่นนี้

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

สิ่งนี้ทำให้ข้อมูลเป็นระเบียบตราบใดที่คุณไม่จำเป็นต้องแยกความแตกต่างระหว่าง NULL และว่างด้วยเหตุผลบางอย่าง



5

ข้อความนี้สะอาดกว่าและอ่านได้มากขึ้นสำหรับฉัน:

select * from my_table where ISNULL(NULLIF(some_col, ''));

4

ขณะตรวจสอบnull or Emptyค่าสำหรับคอลัมน์ในโครงการของฉันฉันสังเกตเห็นว่ามีความกังวลเกี่ยวกับการสนับสนุนในฐานข้อมูลต่างๆ

ทุกฐานข้อมูลไม่รองรับ TRIM วิธี.

ด้านล่างเป็นเมทริกซ์เพื่อทำความเข้าใจวิธีการที่สนับสนุนโดยฐานข้อมูลที่แตกต่างกัน

ฟังก์ชัน TRIM ใน SQL ใช้เพื่อลบคำนำหน้าหรือคำต่อท้ายที่ระบุจากสตริง รูปแบบที่พบบ่อยที่สุดที่ถูกลบคือช่องว่างสีขาว ฟังก์ชั่นนี้เรียกว่าแตกต่างกันในฐานข้อมูลที่แตกต่างกัน:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • ออราเคิล: RTRIM(), LTRIM()
  • เซิร์ฟเวอร์ SQL: RTRIM(), LTRIM()

วิธีตรวจสอบ Empty / Null: -

ด้านล่างมีสองวิธีที่แตกต่างกันตามฐานข้อมูลที่แตกต่างกัน -

ไวยากรณ์สำหรับฟังก์ชั่นการตัดแต่งเหล่านี้คือ:

  1. ใช้ Trim เพื่อตรวจสอบ -

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. ใช้ LTRIM & RTRIM เพื่อตรวจสอบ -

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

ด้านบนทั้งสองวิธีให้ผลลัพธ์ที่เหมือนกันเพียงใช้ตามการสนับสนุนฐานข้อมูลของคุณ มันแค่ส่งกลับFirstNameจากUserDetailsตารางถ้ามันว่างเปล่าLastName

หวังว่าสิ่งนี้จะช่วยคุณได้ :)


3

หากคุณต้องการให้ค่า NULL แสดงเป็นลำดับสุดท้ายเมื่อทำการ ORDER BY ให้ลองทำดังนี้:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;

3

คุณยังสามารถทำ

SELECT * FROM table WHERE column_name LIKE ''

สิ่งที่ตรงกันข้าม

SELECT * FROM table WHERE column_name NOT LIKE ''

เห็นได้ชัดว่าใช้งานไม่ได้: select NULL like ''ส่งคืนNULL- อย่างน้อยใน MySQL
ติตัส

2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';

ฉันมีปัญหาเมื่อเปรียบเทียบกับเขตข้อมูลที่บางครั้งก็ว่างเปล่า สิ่งนี้ช่วย:col1 != IFNULL(col2,'')
webaholik

1

ตรวจสอบค่าว่าง

$column is null
isnull($column)

ตรวจสอบว่างเปล่า

$column != ""

อย่างไรก็ตามคุณควรตั้งค่าไม่เป็นโมฆะสำหรับคอลัมน์
การเพิ่มประสิทธิภาพ mysql สามารถจัดการได้เพียงระดับเดียวเท่านั้น


3
การไม่ยอมรับNULLค่าเป็นอีกหัวข้อหนึ่งสำหรับการอภิปราย ฉันไม่คิดว่าเป็นการเหมาะสมที่จะให้คำแนะนำนั้นโดยไม่ต้องให้เหตุผล
maček

ฉันรวมถึงอดทนด้วย บวกทำให้ชีวิตยากโดยใช้ NULL (เช่นเดียวกับคำถามนี้)
ajreal

5
นั่นเป็นคำแนะนำที่แย่มาก การตั้งค่าไม่เป็นโมฆะในคอลัมน์ที่มีค่าอาจจะไม่เป็นที่รู้จักในช่วงเวลาของการ INSERT เพียงทำหน้าที่เพื่อส่งเสริมการใช้ที่ไม่ได้มาตรฐาน "null" คุณค่าเช่นนั้นและ-1 ''
แดน Bechard

@ หากคุณไม่แน่ใจว่าสิ่งใดมีค่าในระหว่างการแทรกคุณอาจมีปัญหาในการดำเนินการเพิ่มประสิทธิภาพ possilbe ใด ๆ
ajreal

0
select * from table where length(RTRIM(LTRIM(column_name))) > 0

1
มีจุดประสงค์อะไรในการใช้ทั้งสองอย่างRTRIMและLTRIMแต่ไม่ใช่TRIM?
Nico Haase

0

ในกรณีของฉันมีการป้อนช่องว่างในคอลัมน์ในระหว่างการนำเข้าข้อมูลและแม้ว่ามันจะดูเหมือนคอลัมน์ว่างเปล่าความยาวคือ 1 ดังนั้นก่อนอื่นฉันตรวจสอบความยาวของคอลัมน์ค้นหาที่ว่างโดยใช้length(column)จากนั้นเราสามารถเขียนข้อความค้นหา

SELECT * จากตาราง WHERE LENGHT (COLUMN) = ความยาวของคอลัมน์สำหรับคอลัมน์ว่าง


-1

ลองใช้ถ้าประเภทข้อมูลเป็นสตริงและแถวเป็นโมฆะ

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

หากประเภทข้อมูลเป็น int หรือคอลัมน์เป็น 0 ลองนี้

SELECT * FROM table WHERE column_name > = 0

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.