web-dev-qa-db-fra.com

Comment obtenir 0 comme array_length () résultat quand il n'y a pas d'éléments

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);

enter image description here

devrait retourner 0 plutôt que rien (null), non?

Puis-je faire une déclaration si comme en ligne dessus?

Éditer

Selon cette réponse connexe, il ressemble à COALESCE pourrait être ce que je veux - mais je suis ouvert à de meilleures idées:

7
timpone

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.

Alternative à Postgres 9.4

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.

Correction de la requête avec 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.

8
Erwin Brandstetter