จะตรวจสอบค่า null / ว่าง / ช่องว่างด้วยการทดสอบเดี่ยวได้อย่างไร?


88

ฉันต้องการเขียนคำสั่ง SELECT ที่ใช้การทดสอบเพียงครั้งเดียวเพื่อส่งคืนคอลัมน์ที่ไม่มีค่า (ว่างเปล่าหรือช่องว่างทั้งหมด)

ฉันคิดว่าสิ่งนี้จะได้ผล:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';

แต่ใช้ไม่ได้กับค่า NULL

แน่นอนฉันสามารถเพิ่ม

OR column_name IS NULL

และมันจะได้ผล แต่ฉันต้องการวิธีที่ใช้การทดสอบเดียว


1
ที่เกี่ยวข้อง: stackoverflow.com/questions/4042496/…
OMG Ponies

ไม่พึงปรารถนาที่จะมีการทดสอบหลายครั้ง? นั่นคือความละเอียดมากขึ้น = ความคิดเห็นที่ดีกว่าสำหรับผู้ใช้เกี่ยวกับวิธีแก้ไขข้อมูล
onedaywhen

@onedaywhen: โดยทั่วไปมันอาจจะดีกว่าที่จะมีความละเอียดมากขึ้น แต่ฉันกำลังทำงานกับฐานรหัสที่มีอยู่และฉันต้องการเลียนแบบโครงสร้างโค้ดที่มีอยู่ให้ใกล้เคียงที่สุด รหัสปัจจุบันทำการทดสอบเพียงครั้งเดียวดังนั้นฉันจึงมองหาวิธีแก้ปัญหาที่มีการทดสอบเพียงครั้งเดียว
John Gordon

คำตอบ:


101

คุณควรจะสามารถใช้งานได้

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

ปัญหาคือจะไม่ใช้ดัชนีบน COLUMN_NAME คุณจะต้องมีดัชนีตามฟังก์ชันบน TRIM (column_name) หากเป็นเงื่อนไขที่เลือก


32
หมายเหตุสำหรับผู้ใช้ T-SQL: ไม่มี TRIM คุณจะต้องใช้ LTRIM หรือ RTRIM
demoncodemonkey

11
เนื่องจากSQL Server 2017มีฟังก์ชัน TRIM ที่มา
bvwidt

1
@ EhMann365 คำถามนี้เกี่ยวกับ Oracle ไม่ใช่ Sql Server
MH

11
RTRIM (LTRIM (column_name)) - สำหรับผู้ใช้ Microsft SQL
DxTx

4
ใน Sql Server TRIM (column_name) ส่งคืนสตริงว่าง '' ไม่ใช่ NULL คำตอบอื่น ๆ รองรับทั้งสตริงว่างและ NULL
Michael Freidgeim

25
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '') จะคืนค่า '' ถ้า column_name เป็น NULL มิฉะนั้นจะคืนค่า column_name

อัปเดต

ใน Oracle คุณสามารถใช้NVLเพื่อให้ได้ผลลัพธ์เดียวกัน

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''

3
อันที่จริงสิ่งนี้ยังใช้ไม่ได้ใน Oracle Oracle ถือว่าสตริงว่างเป็น NULL ดังนั้นคุณอาจไม่มีประโยค "not like ''" เนื่องจากเปรียบเทียบกับค่า null
Harrison

ฉันจะไม่ต้องการ LIKE '' แทน NOT LIKE '' หรือ
John Gordon

ใช่ขออภัยอ่านคำถามเดิมผิดเนื่องจากต้องการให้ทุกอย่างมีค่า แต่ตามที่ชี้ให้เห็นแล้วดูเหมือนว่าสิ่งนี้จะไม่ทำงานใน Oracle
GendoIkari

เนื่องจากฉันใช้ Oracle ดูเหมือนว่าฉันสามารถใช้ WHERE TRIM (col) IS NULL ได้และจะดูแลค่า null ว่างและช่องว่าง
John Gordon

เห็นได้ชัดว่าส่วนแรกไม่มีวงเล็บควรเป็น:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan

15

ฟังก์ชัน NULLIF จะแปลงค่าคอลัมน์ใด ๆ ที่มีเฉพาะช่องว่างให้เป็นค่า NULL ใช้ได้กับ T-SQL และ SQL Server 2008 ขึ้นไป

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL

1
คำตอบที่ดีจะมีคำอธิบายเกี่ยวกับรหัสและเหตุใดจึงเขียนด้วยวิธีนี้ ฉันขอแนะนำให้คุณอัปเดตคำตอบของคุณ :-)
Qirel

1
ประเด็นนี้คืออะไร? การตั้งค่าเป็น [column_name] LIKE '' จะมีประสิทธิภาพมากขึ้น
SILENT

ต้องใช้ TRIM เพื่อรองรับพื้นที่สีขาวหลายช่อง
Michael Freidgeim

1
การทดสอบบน SQL Server 2017 จะใช้ได้กับพื้นที่สีขาวหลายช่องโดยไม่มี TRIM มันไม่สมเหตุสมผลสำหรับฉันเพราะตามเอกสาร NULLIF ควรส่งคืนค่า NULL เฉพาะในกรณีที่นิพจน์ทั้งสองเท่ากันและโดยปกติสตริงของช่องว่างจะไม่เท่ากับสตริงว่าง (ฉันทดสอบเฉพาะช่องว่างไม่ใช่แท็บบรรทัดใหม่หรืออักขระเว้นวรรคอื่น ๆ )
Jovie

1
@Jovie SQL Server บางครั้งละเว้นช่องว่างต่อท้ายอ่าน: stackoverflow.com/questions/17876478/…
Brian MacKay

7

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

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

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

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

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

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

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

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

  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

หวังว่านี่จะช่วยคนอื่น ๆ ด้วย :)


ด้วย t as (เลือก '' c union all select '' c union all เลือก NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) IS NULL; ไม่ได้ส่งคืน 3 ระเบียนบนเซิร์ฟเวอร์ SQL
Waqar

5
ทำไมต้องใช้ทั้ง L & RTRIM ฟังก์ชั่นเดียวไม่เพียงพอที่จะตรวจสอบว่าคอลัมน์ว่างเปล่าหรือไม่?
SILENT

4

แบบสอบถาม phpMyAdmin นี้กำลังส่งคืนแถวเหล่านั้นซึ่งไม่เป็นค่าว่างหรือว่างเปล่าหรือเป็นเพียงช่องว่าง:

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))

หากคุณต้องการเลือกแถวที่ว่าง / ว่าง / เพียงช่องว่างเพียงแค่ลบ NOT




0

ทุกคนแนะนำให้รันคิวรีใน Oracle เพื่อค้นหาเรกคอร์ดที่มีฟิลด์เฉพาะว่าง (ไม่รวม (null) หรือฟิลด์อื่นใดที่เป็นเพียงบรรทัดว่าง) ไม่ได้ผล ฉันลองใช้ทุกรหัสที่แนะนำ เดาว่าฉันจะค้นหาทางออนไลน์ต่อไป

***** อัพเดท *****

ฉันลองแล้วมันใช้งานได้ไม่แน่ใจว่าทำไมมันถึงใช้ไม่ได้ถ้า <1 แต่ด้วยเหตุผลบางอย่าง <2 ใช้งานได้และส่งคืนเฉพาะระเบียนที่มีฟิลด์ว่าง

เลือก [columnName] จาก [tableName] โดยที่ LENGTH (columnName) <2;

ฉันเดาว่าสคริปต์ใดก็ตามที่ใช้ในการแปลงข้อมูลได้ทิ้งบางสิ่งไว้ในฟิลด์แม้ว่าจะแสดงว่างเปล่านั่นคือการคาดเดาของฉันว่าทำไม <2 ถึงใช้งานได้ แต่ไม่ใช่ <1

อย่างไรก็ตามหากคุณมีค่าอื่น ๆ ในช่องคอลัมน์นั้นที่น้อยกว่าสองอักขระคุณอาจต้องหาวิธีแก้ไขปัญหาอื่น หากไม่มีตัวละครอื่น ๆ จำนวนมากคุณสามารถแยกออกได้

หวังว่าวิธีแก้ปัญหาของฉันจะช่วยให้ใครบางคนอยู่ที่นั่นได้สักวัน


-3

เช่นเดียวกับใน Oracle คุณสามารถใช้ฟังก์ชัน NVL ใน MySQL คุณสามารถใช้ IFNULL (columnaName, newValue) เพื่อให้ได้ผลลัพธ์ที่คุณต้องการดังตัวอย่างนี้

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';

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