Ich habe eine Frage wie diese:
select id, array_length(users_who_like_ids,1) as ct
from queryables
order by 2 desc;
Aber leere Arrays (ohne Elemente) werden oben sortiert. Ich hätte lieber array_length()
0 für diesen Fall zurückgegeben, damit dies nach unten sortiert wird.
Ich verstehe wahrscheinlich nicht array_length()
(ok, definitiv) aber:
embers_dev2=# select array_length(array[1,2], 1), array_length(ARRAY[]::integer[],1);
sollte eher 0 als nichts (NULL) zurückgeben, oder?
Könnte ich eine if-Anweisung wie inline darauf machen?
Bearbeiten
Nach dieser verwandten Antwort auf SO sieht es so aus, als ob COALESCE
es das ist, was ich will - aber ich bin offen für bessere Ideen:
postgresql
order-by
null
array
Timpone
quelle
quelle
Antworten:
Es steht zur Debatte, was dies zurückgeben soll . Aber wie Postgres es definiert, ist das Ergebnis für jede Dimension, die nicht existiert, NULL.
COALESCE
ist das Werkzeug, um Ihre Abfrage zu korrigieren, aber die bessere Lösung besteht darin, sie zunächst nicht zu brechen.Alternative in Postgres 9.4
Postgres 9.4 oder höher bietet eine separate Funktion
cardinality()
, die gemäß Dokumentation:Meine kühne Betonung.
Scheint , wie Sie mit 1-dimensionalen Arrays ausschließlich beschäftigen und wollen einfach nur nutzen , dass .
Dies ist jedoch noch nicht die richtige Lösung für Ihr Problem. Das gesamte Array kann NULL sein, was in beide Richtungen NULL zurückgibt und immer noch oben sortiert.
Abfrage mit korrigieren
NULLS LAST
Dies immer beschäftigt sich mit NULL - Werte richtig. Möglicherweise möchten Sie noch
cardinality()
leere Arrays vor NULL sortieren. Beachten Sie jedoch den Unterschied beim Umgang mit mehrdimensionalen Arrays.quelle
count()
niemals NULL zurückgibt.