Bagaimana saya bisa membandingkan dengan nilai yang mungkin nol di Oracle?

Saya melihat sejumlah variasi pada pertanyaan ini tetapi semuanya sepertinya berbicara tentang kinerja dan indeks ketika bertanya tentang membandingkan nilai nol.

Masalah saya adalah saya memiliki SELECT bersarang yang dapat mengembalikan nol yang saya bandingkan berdasarkan parameter tanggal.

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(+)

sepertinya ketika pilihan bersarang di sini mengembalikan nol maka gabungan kiri menjadi kacau.

Saya akan dengan senang hati menyertakan beberapa data palsu jika diperlukan, tetapi mungkin saya hanya melewatkan sesuatu. Yang perlu saya lakukan adalah perbandingan Fieldc hanya terjadi dalam spesifikasi tanggal tersebut.

Terima kasih atas wawasan apa pun. Terima kasih.

Informasi lebih lanjut:

Data Table_One: semua bidang adalah varchar2

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

Tabel_Dua Data: semua bidang adalah varchar2

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

Table_Three Data: CompareValue adalah varchar2, date_ adalah tanggal

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

Jadi jika parameternya hari ini, pilih mengembalikan 'fval' dan kita mendapatkan gabung kiri dengan benar. namun, ketika parameter tanggal sebelum '10-09-2012' maka pilihan bersarang membandingkan nol dan gabungan kiri tidak terjadi dengan benar. Ini adalah versi sederhana dari versi aslinya.

Terima kasih


person dee    schedule 11.09.2012    source sumber
comment
apakah Anda ingin cocok ketika nilainya nol atau tidak cocok?   -  person Randy    schedule 12.09.2012
comment
Tidak jelas bagi saya dari pertanyaan mengapa gabungan luar kiri diperlukan.   -  person David Faber    schedule 12.09.2012
comment
Tidak terkait dengan pertanyaan Anda, namun demikian: jangan gunakan operator (+) untuk gabungan luar. Gunakan sintaks LEFT JOIN yang tepat.   -  person a_horse_with_no_name    schedule 12.09.2012
comment
Kekacauan gabung kiri tidak terlalu informatif. Apa sebenarnya maksudnya? Kode kesalahan? Jika subquery mengembalikan null, apa yang Anda inginkan terjadi?   -  person DCookie    schedule 12.09.2012


Jawaban (3)


gunakan NVL(inDate, sysdate+1) untuk tidak cocok ketika null

person Randy    schedule 11.09.2012

Saya berasumsi Anda memilih dari tabel a dengan syarat a.Fieldc dianggap "aktif", karena di table_three inDate terletak di antara beberapa tanggal mulai dan tanggal sysdate.

Oleh karena itu menurut saya Anda tidak ingin selalu mendapatkan hasil. Sebaliknya saya menyarankan Anda untuk menangani hasil kosong dalam kode Anda.

Saya khawatir saya tidak dapat memberikan jawaban yang lebih tepat, karena Anda belum membagikan informasi lebih lanjut tentang kasus Anda.

person winkbrace    schedule 11.09.2012
comment
Bazz Anda benar, saya mencocokkan nilai di table_three saat aktif berdasarkan tanggal. Saya menyertakan info tambahan dalam pertanyaan saya untuk mencerminkan hal ini. - person dee; 12.09.2012

Anda perlu memahami perbedaan antara nilai No records dan Null. Saat Anda mengatakan - "ketika parameter tanggal sebelum '10-09-2012' maka pilihan bersarang membandingkan nol dan gabungan kiri tidak terjadi dengan benar", ini berarti SELECT mengembalikan satu baris tetapi nilai barisnya adalah NULL ( ini tidak sama dengan Tidak ada catatan). Dalam hal ini, melakukan NVL pada nilai kolom NULL dan menggantinya dengan string palsu (seperti yang Anda katakan) akan berfungsi seperti-

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

Di atas akan mengembalikan dummy jika CompareValue adalah NULL tetapi tidak jika kueri mengembalikan NO RECORDS sama sekali.

Namun, melihat data Anda, saya tidak melihat kemungkinan nilai NULL yang membuat saya percaya bahwa subkueri akan benar-benar mengembalikan NO RECORDS (tidak sama dengan NULL) jika inDate sebelum 10-09-2012. Dalam hal ini permintaan Anda akan baik-baik saja (kecuali ada sesuatu yang salah di tempat lain).

person AnBisw    schedule 12.09.2012