ฉันจะเปรียบเทียบกับค่าว่างใน oracle ได้อย่างไร

ฉันเห็นรูปแบบต่างๆ มากมายในคำถามนี้ แต่ดูเหมือนว่าจะพูดถึงประสิทธิภาพและดัชนีเมื่อถามเกี่ยวกับการเปรียบเทียบค่า Null

ปัญหาของฉันคือฉันมี SELECT ที่ซ้อนกันซึ่งสามารถส่งคืนค่าว่างที่ฉันกำลังเปรียบเทียบโดยอิงตามพารามิเตอร์วันที่

SELECT a.* 
FROM Table_One a,
     Table_Two b
WHERE a.Fieldc IN (SELECT CompareValue from Table_Three cv WHERE inDate between cv.Date_ and SYSDATE)
AND a.Fielda = b.Fieldb(+)

ดูเหมือนว่าเมื่อการเลือกแบบซ้อนที่นี่ส่งคืนค่าว่าง การรวมด้านซ้ายจะเลอะเทอะ

ฉันยินดีที่จะใส่ข้อมูลปลอมหากจำเป็น แต่บางทีฉันอาจพลาดอะไรบางอย่างไป สิ่งที่ฉันต้องเกิดขึ้นคือการเปรียบเทียบ Fieldc เกิดขึ้นภายในข้อกำหนดวันที่นั้นเท่านั้น

ขอบคุณสำหรับข้อมูลเชิงลึก ขอบคุณ.

ข้อมูลเพิ่มเติม:

Table_One Data: ทุกฟิลด์เป็น varchar2

Fielda | Fieldb | Fieldc|
'aVal' | 'bVal' | 'cVal'|
'dVal' | 'eVal  | 'fVal'|
'dVal' | 'fVal  | 'eVal'|

Table_Two Data: ทุกฟิลด์เป็น varchar2

Fielda | Fieldb | Fieldc|
'aVal' | 'bVal' | 'cVal'|
'dVal' | 'fVal  | 'gVal'|
'dVal' | 'fVal  | 'cVal'|

Table_Three Data: CompareValue คือ varchar2, date_ คือวันที่

CompareValue | date_      |
'fval'       | 2012-09-10 |

ดังนั้นหากพารามิเตอร์เป็นวันนี้ การเลือกจะส่งกลับ 'fval' และเราจะเข้าร่วมอย่างถูกต้อง อย่างไรก็ตาม เมื่อพารามิเตอร์วันที่อยู่ก่อน '2012-09-10' การเลือกแบบซ้อนจะเปรียบเทียบค่าว่างและการรวมด้านซ้ายจะไม่เกิดขึ้นอย่างถูกต้อง นี่เป็นเวอร์ชันที่เรียบง่ายของต้นฉบับเล็กน้อย

ขอบคุณ


person dee    schedule 11.09.2012    source แหล่งที่มา
comment
คุณต้องการให้ตรงกันเมื่อค่าเป็นโมฆะหรือไม่ตรงกัน?   -  person Randy    schedule 12.09.2012
comment
ฉันไม่ชัดเจนสำหรับฉันจากคำถามว่าทำไมจึงจำเป็นต้องมีการรวมภายนอกด้านซ้ายเลย   -  person David Faber    schedule 12.09.2012
comment
ไม่เกี่ยวข้องกับคำถามของคุณ แต่อย่างไรก็ตาม: อย่าใช้ตัวดำเนินการ (+) สำหรับการรวมภายนอก ใช้ไวยากรณ์ LEFT JOIN ที่เหมาะสม   -  person a_horse_with_no_name    schedule 12.09.2012
comment
การเข้าร่วมด้านซ้ายทำให้เกิดความยุ่งเหยิงไม่ได้ให้ข้อมูลมากนัก นั่นหมายความว่าอย่างไร? รหัสข้อผิดพลาด? หากแบบสอบถามย่อยส่งคืนค่าว่าง คุณต้องการให้เกิดอะไรขึ้น   -  person DCookie    schedule 12.09.2012


คำตอบ (3)


ใช้ NVL(inDate, sysdate+1) เพื่อไม่ให้ตรงกันเมื่อเป็นโมฆะ

person Randy    schedule 11.09.2012

ฉันคิดว่าคุณกำลังเลือกจากตาราง a โดยมีเงื่อนไขว่า a.Fieldc ถือเป็น "ใช้งานอยู่" เนื่องจากใน table_three นั้นเป็น inDate ระหว่างวันที่เริ่มต้นและ sysdate

ดังนั้นผมไม่คิดว่าคุณต้องการผลเสมอไป ฉันขอแนะนำให้คุณจัดการกับผลลัพธ์ที่ว่างเปล่าในโค้ดของคุณแทน

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

person winkbrace    schedule 11.09.2012
comment
Bazz คุณพูดถูก ฉันกำลังจับคู่กับค่าใน table_three เมื่อใช้งานตามวันที่ ฉันกำลังรวมข้อมูลเพิ่มเติมในคำถามของฉันเพื่อสะท้อนถึงสิ่งนี้ - person dee; 12.09.2012

คุณต้องเข้าใจความแตกต่างระหว่างค่า No records และ Null เมื่อคุณพูดว่า - "เมื่อพารามิเตอร์วันที่อยู่ก่อน '2012-09-10' การเลือกที่ซ้อนกันกำลังเปรียบเทียบค่าว่างและการรวมด้านซ้ายไม่เกิดขึ้นอย่างถูกต้อง" ซึ่งหมายความว่า SELECT ส่งคืนแถว แต่ค่าของแถวคือ NULL ( ซึ่งไม่เหมือนกับไม่มีบันทึก) ในกรณีนี้ การทำ NVL กับค่าคอลัมน์ NULL และแทนที่ด้วยสตริงปลอม (ตามที่คุณบอก) จะทำงานเหมือน-

SELECT NVL(CompareValue,'dummy') 
  from Table_Three cv WHERE inDate between cv.Date_ and SYSDATE

ค่าข้างต้นจะส่งกลับ dummy หาก CompareValue เป็น NULL แต่จะไม่ส่งคืนหากแบบสอบถามส่งคืน NO RECORDS เลย

อย่างไรก็ตาม เมื่อดูข้อมูลของคุณแล้ว ฉันไม่เห็นความเป็นไปได้ที่ค่า NULL ทำให้ฉันเชื่อว่าแบบสอบถามย่อยจะส่งกลับ NO RECORDS จริง ๆ (ไม่เหมือนกับ NULL) หาก inDate เป็นก่อน 2012-09-10 ในกรณีนี้ ข้อความค้นหาของคุณควรถูกต้องสมบูรณ์ (เว้นแต่จะมีสิ่งอื่นผิดพลาดจากที่อื่น)

person AnBisw    schedule 12.09.2012