Pertimbangkan pernyataan pilih ini:
SELECT *,
1 AS query_id
FROM players
WHERE username='foobar';
Ini mengembalikan kolom query_id
dengan nilai 1
bersama dengan kolom pemain lain.
Bagaimana cara membuat SQL di atas mengembalikan setidaknya query_id
dari 1
bahkan jika pilih tidak menemukan baris yang cocok?
BTW, ini PostgreSQL 8.4.
postgresql
select
null
Nathanael Weiss
sumber
sumber
order by
. Yang kedua "menciptakan" tabel virtual dengan tepat satu baris dan satu kolom dan melakukan penggabungan luar (tanpa kondisi gabungan "nyata"), sehingga Anda selalu mendapatkan kembali setidaknya satu baris. Menggunakanselect *
kode produksi adalah gaya yang buruk. Jangan lakukan itu. Selalu daftarkan kolom yang Anda butuhkan.select *
seharusnya hanya digunakan dalam permintaan ad-hoc.left join
tidak dapat dibaca?UNION ALL
kadang-kadang bisa lebih efisien daripadaUNION
, karena Anda secara eksplisit memberi tahu perencana kueri bahwa Anda berharap tidak ada baris duplikat yang keluar dariUNION
kueri ed atau jika ada yang ingin mereka menjadi output. TanpaALL
pengubah itu diasumsikan Anda ingin duplikat menghapus baris (hanya satu dari masing-masing kembali) seperti denganDISTINCT
kata kunci, dan untuk menjamin bahwa itu mungkin perlu resor + menelusuri kembali hasil waktu tambahan. Jadi gunakanALL
denganUNION
kecuali Anda secara khusus membutuhkan de-duplikasi baris output.Jika Anda hanya mengharapkan satu atau nol baris kembali, maka ini juga akan berfungsi:
Ini akan mengembalikan satu baris dengan semua nilai memiliki null kecuali query_id jika tidak ada baris yang ditemukan.
sumber
username = 'foobar'
Ceroboh di sini terlambat, tapi di sini ada sintaks yang berfungsi (setidaknya di 9.2, belum mencoba versi sebelumnya).
Hanya akan mengembalikan baris "kosong" jika seluruh konten "a" adalah nol.
Nikmati. / Bithead
sumber
sumber