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!