Saya menemukan diri saya menulis yang berikut:
select 'yes'
where exists(select * from foo where val=1)
and not exists(select * from foo where val<>1);
dan bertanya-tanya apakah ada cara yang lebih ringkas tanpa mengorbankan terlalu banyak keterbacaan.
Saya menemukan satu cara yang saya posting sebagai jawaban tetapi saya tidak sepenuhnya senang dengan itu dan akan sangat tertarik dengan alternatif
Dalam hal val
ini unik di dalamnya foo
- tidak ada duplikat
postgresql
duplication
Jack mengatakan coba topanswers.xyz
sumber
sumber
count(distinct val)
, meskipun dalam kasus dunia nyata saya tidak ada bedanyaJawaban:
Ringkas, cepat (terutama dengan banyak baris), favorit saya tentang keterbacaan dan akan bekerja dengan dupes juga:
Mengembalikan
TRUE
/FALSE
.. atauNULL
- hanya dalam kasus tepat satu baris denganval IS NULL
, karenacount()
tidak pernah mengembalikanNULL
atau tanpa baris.Yang kedua
1
dalam contoh kebetulan sama dengan yang pertama, karena contoh Anda.Kueri dalam pertanyaan gagal dengan
NULL
nilai. Pertimbangkan demo sederhana:IS DISTINCT FROM
akan memperbaiki ini, tetapi masih bisa gagal dengan duplikat dival
- yang telah Anda singkirkan untuk kasus ini.Jawaban Anda bekerja dengan baik.
Kembali
'yes'
/ tidak ada baris.Saya lebih suka bentuk yang lebih pendek ini. Jangan lupa bahwa PostgreSQL (tidak seperti Oracle) memiliki
boolean
tipe yang tepat .Pengembalian
TRUE
/FALSE
/NULL
.sumber
Variasi jawaban @ Erwin. Tidak
COUNT()
sama sekali, hanyaMIN()
danMAX()
. Mungkin sedikit lebih efisien dengan tabel besar dan (tidak dalam kasus Anda) duplikatval
:sumber
sumber
Ini kembali
true
,false
atau hasil kosong:sumber
false
jika ada nilai difoo
manaval<>1
?NULL
nilai yang belum dikesampingkan dalam kasus ini.NULL
dapat dikerjakan dengan menggunakanIS [NOT] DISTINCT FROM
kurasa.LEFT JOIN foo j ON j.val <> foo.val
gagal mendeteksi baris denganj.val IS NULL
mulai. Jika Anda akan menyertakannya makaON j.val IS DISTINCT FROM foo.val
Anda perlu memeriksa kolom lain yangj
ditentukanNOT NULL
untuk membedakan kedua kasus tersebut. Tetapi tidak ada kolom tambahan yang didefinisikan.