За разлика от някои други бази данни (като 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'
В първия пример изразът вдясно е константа, която се изчислява веднъж . След това може да се използва индекс за търсене на съвпадащи редове. Много ефективен.
Последният обикновено не може да се използва с индекс. Трябва да се изчисли стойност за всеки отделен ред, преди да може да бъде проверена спрямо константния израз вдясно. Не правете това, ако можете да го избегнете. Никога!