Tidak seperti beberapa database lain (seperti Oracle) PostgreSQL memiliki boolean
yang berfungsi penuh Tipe. Anda dapat menggunakannya langsung dalam ORDER BY
klausa tanpa menerapkan CASE
pernyataan - itu bagus untuk situasi yang lebih kompleks.
Urutkan urutan untuk boolean
nilainya adalah:
FALSE -> TRUE -> NULL
Jika Anda ORDER BY bool_expression
DESC
, Anda membalikkan urutannya menjadi:
NULL -> TRUE -> FALSE
Jika Anda ingin TRUE
pertama dan NULL
terakhir, gunakan NULLS LAST
klausa ORDER BY
:
ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST
, created_at DESC
Tentu saja, NULLS LAST
hanya relevan jika featured
atau created_at
bisa menjadi NULL
. Jika kolom didefinisikan NOT NULL
, maka jangan repot-repot.
Juga, FALSE
akan diurutkan sebelum NULL
. Jika Anda tidak ingin membedakan antara keduanya, Anda dapat kembali ke CASE
pernyataan, atau Anda dapat memasukkan NULLIF()
atau COALESCE()
.
ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
DESC NULLS LAST
, created_at DESC
Kinerja
Perhatikan, bagaimana saya menggunakan:
created_at > now() - interval '11 days'
dan tidak :
now() - created_at < interval '11 days'
Pada contoh pertama, ekspresi ke kanan adalah konstanta yang dihitung sekali . Kemudian indeks dapat digunakan untuk mencari baris yang cocok. Sangat efisien.
Yang terakhir biasanya tidak dapat digunakan dengan indeks. Nilai harus dihitung untuk setiap baris, sebelum dapat diperiksa terhadap ekspresi konstan di sebelah kanan. Jangan lakukan ini jika Anda bisa menghindarinya. Pernah!