Dalam WHERE
klausa dari kueri SQL, saya berharap dua kondisi ini memiliki perilaku yang sama:
NOT (a=1 AND b=1)
vs.
a<>1 AND b<>1
Kondisi pertama berperilaku seperti yang diharapkan, dan sementara saya membenarkan kondisi kedua untuk melakukan hal yang sama, itu tidak.
Ini adalah hal yang sangat mendasar, tetapi dengan malu saya tidak dapat melihat apa yang saya lakukan salah.
a <> 1 OR b<>1
.Jawaban:
Mereka tidak setara.
setara dengan:
Kesetaraan ini dikenal sebagai
De Morgan's Law
. Lihat misalnya:https://en.wikipedia.org/wiki/De_Morgan%27s_laws
Teknik yang bagus untuk membuktikan / menyangkal persamaan untuk ekspresi aljabar boolean adalah dengan menggunakan cte untuk domain, dan membandingkan ekspresi berdampingan:
Sunting: Karena DB2 tidak mendukung tipe data Boolean, saya memperluas contoh di:
http://sqlfiddle.com/#!15/25e1a/19
Kueri yang ditulis ulang terlihat seperti:
Hasil kueri adalah:
Seperti yang ditunjukkan, exp1 dan exp2 adalah sama.
sumber
with T(a) as ( values 0,1,NULL )
dan menjalankan kembali kueri dan Anda akan melihat apa yang terjadi. NULL pasti melempar kunci pas di sebagian besar aturan kesetaraan yang kita pelajari. Jawaban singkatnya adalah = NULL dan a < > NULL keduanya menghasilkan NULL, sehingga mereka akan jatuh ke kasus lain. Untuk bacaan lebih lanjut: ( stackoverflow.com/questions/1833949/… )Contoh pertama Anda mengatakan:
Contoh kedua Anda mengatakan:
Agar kueri kedua untuk mengembalikan sama dengan yang pertama, Anda harus mengubah
AND
keOR
Ini mengembalikan hasil berikut
sumber
a<>1 AND b<>1
diterjemahkan menjadi "baik a = 1 ATAU b = 1"?NOT ( a=1 OR b=1 )
. Bahasa alami yang disayangkan mengandung ambiguitas yang membuatnya sulit untuk menerjemahkan formula logis ke bahasa alami dan sebaliknya. Misalnya, apakahneither a=1 nor b=1
artinyaNOT ( a=1 OR b=1 )
atau(NOT a=1) OR (NOT b=1)
?