J'ai une question comme ceci:
select id, array_length(users_who_like_ids,1) as ct
from queryables
order by 2 desc;
Mais des tableaux vides (sans éléments) trient sur le dessus. Je préférerais avoir array_length()
retourner 0 pour cette affaire afin que cela soit trié au fond.
Je ne comprends probablement pas array_length()
(OK, définitivement) mais:
embers_dev2=# select array_length(array[1,2], 1), array_length(ARRAY[]::integer[],1);
devrait retourner 0 plutôt que rien (null), non?
Puis-je faire une déclaration si comme en ligne dessus?
Selon cette réponse connexe, il ressemble à COALESCE
pourrait être ce que je veux - mais je suis ouvert à de meilleures idées:
devrait retourner 0 plutôt que rien (null), non?
C'est en train de débattre de quoi cela devrait retour. Mais la façon dont Postgres le définit, le résultat de toute dimension qui n'existe pas est null.
COALESCE
est l'outil pour corriger votre requête, mais la meilleure solution n'est pas de le casser pour commencer.
Postgres 9.4 ou ultérieure fournit une fonction distincte cardinality()
que par documentation :
renvoie le nombre total d'éléments dans la matrice ou 0 si le tableau est vide
Mine d'accompagnement audacieux.
[.____] Semble que vous traitez avec des matrices à 1 dimension exclusivement et souhaitez simplement utiliser ça.
test=# SELECT cardinality('{}'::int[]);
cardinality
-------------
0
Cependant, ce n'est pas la solution appropriée pour votre problème, pourtant. L'ensemble de la matrice pourrait être NULL, qui retourne NULL de quelque manière que ce soit et reste toujours en haut.
NULLS LAST
SELECT id, array_length(users_who_like_ids, 1) AS ct
FROM queryables
ORDER BY 2 DESC NULLS LAST;
Ceci TOUJOURS traite correctement les valeurs nulelles. Vous voudrez peut-être toujours utiliser cardinality()
pour trier les tableaux vides avant NULL. Mais soyez conscient de la différence lors de la gestion des tableaux multidimensionnels.