За разлика от някои други бази данни (като Oracle), PostgreSQL има напълно функционален boolean Тип. Можете да го използвате директно в ORDER BY клауза без прилагане на CASE изявление - те са чудесни за по-сложни ситуации.
Ред на сортиране за boolean стойности е:
FALSE -> TRUE -> NULL
Ако ORDER BY bool_expression DESC , обръщате реда към:
NULL -> TRUE -> FALSE
Ако искате TRUE първо и NULL накрая, използвайте NULLS LAST клауза на ORDER BY :
ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST
, created_at DESC
Разбира се, NULLS LAST е подходящ само ако featured или created_at може бъде NULL . Ако колоните са дефинирани NOT NULL , тогава не се притеснявай.
Също така, FALSE ще бъдат сортирани преди NULL . Ако не искате да правите разлика между тези две, вие или се връщате към CASE изявление или можете да въведете NULLIF() или COALESCE() .
ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
DESC NULLS LAST
, created_at DESC
Ефективност
Забележете как използвах:
created_at > now() - interval '11 days'
и не :
now() - created_at < interval '11 days'
В първия пример изразът вдясно е константа, която се изчислява веднъж . След това може да се използва индекс за търсене на съвпадащи редове. Много ефективен.
Последният обикновено не може да се използва с индекс. Трябва да се изчисли стойност за всеки отделен ред, преди да може да бъде проверена спрямо константния израз вдясно. Не правете това, ако можете да го избегнете. Никога!