ฉันมีคอลัมน์ในตารางซึ่งอาจมีค่า Null หรือค่าว่าง ฉันจะตรวจสอบได้อย่างไรว่าคอลัมน์ว่างเปล่าหรือเป็นโมฆะในแถวที่อยู่ในตาราง
(e.g. null or '' or ' ' or ' ' and ...)
ฉันมีคอลัมน์ในตารางซึ่งอาจมีค่า Null หรือค่าว่าง ฉันจะตรวจสอบได้อย่างไรว่าคอลัมน์ว่างเปล่าหรือเป็นโมฆะในแถวที่อยู่ในตาราง
(e.g. null or '' or ' ' or ' ' and ...)
คำตอบ:
สิ่งนี้จะเลือกแถวทั้งหมดที่some_col
มีNULL
หรือ''
(สตริงว่าง)
SELECT * FROM table WHERE some_col IS NULL OR some_col = '';
WHERE some_col IS NULL OR some_col = ' '
(หนึ่งช่องว่างใส่ในสตริง) แสดงว่าทำงานได้ทั้งใน MySQL และ Oracle โปรดดูคำตอบของ "onedaywhen" some_col = ''
ไม่ทำงานบน Oracle เนื่องจากสตริงว่างหมายถึง NULL ตรงนั้น
' '
มันจะไม่ทำงานใน SQLite มันจัดการการจับคู่สตริงที่เหมือนกัน / โดยตรงเท่านั้น
ตามที่กำหนดโดยมาตรฐาน 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;
WHERE some_col IS NULL OR some_col = ' '
(หนึ่งช่องว่างในสตริง) แล้วมันทำงานได้ทั้งใน MySQL และ Oracle some_col = ''
ไม่ทำงานบน Oracle เนื่องจากสตริงว่างหมายถึง NULL ตรงนั้นและเงื่อนไขทั้งหมดกลายเป็น NULL
SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' ';
และSELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;
ทำงานให้ฉันใน MySQL หวังว่านี่จะเป็นประโยชน์
'' = ' '
งานได้จริงใน SQLServer แต่ไม่ใช่ใน SQLite เท่าที่ฉันสามารถบอกได้จากการทดสอบตอนนี้
วิธีที่สั้นกว่าในการเขียนเงื่อนไข:
WHERE some_col > ''
ตั้งแต่null > ''
ผลิตunknown
สิ่งนี้มีผลในการกรองทั้งnull
สตริงและว่างเปล่า
coalesce(some_col, '') = ''
คุณสามารถทดสอบว่าคอลัมน์เป็นโมฆะหรือไม่โมฆะใช้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
)
ก่อนหน้า=
เครื่องหมายในตัวอย่างที่สองของคุณ
วิธีอื่นโดยที่ไม่ลองนี้ ..
จะเลือกทั้งค่าว่างและค่า NULL
SELECT ISNULL(NULLIF(fieldname,'')) FROM tablename
ทั้ง
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
ฉันเกลียดเขตข้อมูลยุ่งในฐานข้อมูลของฉัน หากคอลัมน์อาจเป็นสตริงว่างหรือโมฆะฉันควรแก้ไขก่อนที่จะทำการเลือกในแต่ละครั้งเช่นนี้
UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL
สิ่งนี้ทำให้ข้อมูลเป็นระเบียบตราบใดที่คุณไม่จำเป็นต้องแยกความแตกต่างระหว่าง NULL และว่างด้วยเหตุผลบางอย่าง
ลอง
SELECT 0 IS NULL , '' IS NULL , NULL IS NULL
-> 0, 0, 1
หรือ
SELECT ISNULL(' ') , ISNULL( NULL )
-> 0 ,1
ข้อความนี้สะอาดกว่าและอ่านได้มากขึ้นสำหรับฉัน:
select * from my_table where ISNULL(NULLIF(some_col, ''));
ขณะตรวจสอบnull or Empty
ค่าสำหรับคอลัมน์ในโครงการของฉันฉันสังเกตเห็นว่ามีความกังวลเกี่ยวกับการสนับสนุนในฐานข้อมูลต่างๆ
ทุกฐานข้อมูลไม่รองรับ TRIM
วิธี.
ด้านล่างเป็นเมทริกซ์เพื่อทำความเข้าใจวิธีการที่สนับสนุนโดยฐานข้อมูลที่แตกต่างกัน
ฟังก์ชัน TRIM ใน SQL ใช้เพื่อลบคำนำหน้าหรือคำต่อท้ายที่ระบุจากสตริง รูปแบบที่พบบ่อยที่สุดที่ถูกลบคือช่องว่างสีขาว ฟังก์ชั่นนี้เรียกว่าแตกต่างกันในฐานข้อมูลที่แตกต่างกัน:
TRIM(), RTRIM(), LTRIM()
RTRIM(), LTRIM()
RTRIM(), LTRIM()
วิธีตรวจสอบ Empty / Null: -
ด้านล่างมีสองวิธีที่แตกต่างกันตามฐานข้อมูลที่แตกต่างกัน -
ไวยากรณ์สำหรับฟังก์ชั่นการตัดแต่งเหล่านี้คือ:
ใช้ Trim เพื่อตรวจสอบ -
SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL
ใช้ LTRIM & RTRIM เพื่อตรวจสอบ -
SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL
ด้านบนทั้งสองวิธีให้ผลลัพธ์ที่เหมือนกันเพียงใช้ตามการสนับสนุนฐานข้อมูลของคุณ มันแค่ส่งกลับFirstName
จากUserDetails
ตารางถ้ามันว่างเปล่าLastName
หวังว่าสิ่งนี้จะช่วยคุณได้ :)
หากคุณต้องการให้ค่า NULL แสดงเป็นลำดับสุดท้ายเมื่อทำการ ORDER BY ให้ลองทำดังนี้:
SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;
คุณยังสามารถทำ
SELECT * FROM table WHERE column_name LIKE ''
สิ่งที่ตรงกันข้าม
SELECT * FROM table WHERE column_name NOT LIKE ''
select NULL like ''
ส่งคืนNULL
- อย่างน้อยใน MySQL
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';
col1 != IFNULL(col2,'')
ตรวจสอบค่าว่าง
$column is null
isnull($column)
ตรวจสอบว่างเปล่า
$column != ""
อย่างไรก็ตามคุณควรตั้งค่าไม่เป็นโมฆะสำหรับคอลัมน์
การเพิ่มประสิทธิภาพ mysql สามารถจัดการได้เพียงระดับเดียวเท่านั้น
NULL
ค่าเป็นอีกหัวข้อหนึ่งสำหรับการอภิปราย ฉันไม่คิดว่าเป็นการเหมาะสมที่จะให้คำแนะนำนั้นโดยไม่ต้องให้เหตุผล
-1
''
select * from table where length(RTRIM(LTRIM(column_name))) > 0
RTRIM
และLTRIM
แต่ไม่ใช่TRIM
?
ในกรณีของฉันมีการป้อนช่องว่างในคอลัมน์ในระหว่างการนำเข้าข้อมูลและแม้ว่ามันจะดูเหมือนคอลัมน์ว่างเปล่าความยาวคือ 1 ดังนั้นก่อนอื่นฉันตรวจสอบความยาวของคอลัมน์ค้นหาที่ว่างโดยใช้length(column)
จากนั้นเราสามารถเขียนข้อความค้นหา
SELECT * จากตาราง WHERE LENGHT (COLUMN) = ความยาวของคอลัมน์สำหรับคอลัมน์ว่าง
ลองใช้ถ้าประเภทข้อมูลเป็นสตริงและแถวเป็นโมฆะ
SELECT * FROM table WHERE column_name IS NULL OR column_name = ''
หากประเภทข้อมูลเป็น int หรือคอลัมน์เป็น 0 ลองนี้
SELECT * FROM table WHERE column_name > = 0
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')
NULL
นี้จะไม่เลือก
select isnull(mycolumn) from mytable
ส่งคืน 1 ถ้า mycolumn เป็นโมฆะ