So erhalten Sie 0 als array_length () - Ergebnis, wenn keine Elemente vorhanden sind

7

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

Geben Sie hier die Bildbeschreibung ein

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 COALESCEes das ist, was ich will - aber ich bin offen für bessere Ideen:

Timpone
quelle
Verwandte vorherige Frage: dba.stackexchange.com/q/122187/3684
Erwin Brandstetter

Antworten:

8

sollte eher 0 als nichts (NULL) zurückgeben, oder?

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:

Gibt die Gesamtzahl der Elemente im Array zurück oder 0, wenn das Array leer ist

Meine kühne Betonung.
Scheint , wie Sie mit 1-dimensionalen Arrays ausschließlich beschäftigen und wollen einfach nur nutzen , dass .

test=# SELECT cardinality('{}'::int[]);
 cardinality
-------------
           0

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

SELECT id, array_length(users_who_like_ids, 1) AS ct
FROM   queryables
ORDER  BY 2 DESC 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.

Erwin Brandstetter
quelle
Ich habe meine Antwort auf Ihre vorherige Frage entsprechend aktualisiert: dba.stackexchange.com/a/122511/3684 . Beachten Sie, dass die erste Abfrage dort ein ähnliches Problem vermeidet, da die Aggregatfunktion count()niemals NULL zurückgibt.
Erwin Brandstetter
Danke Erwin für die exzellente Antwort (wieder) - wird definitiv mit NULLS LAST gehen und hoffentlich bald mehrdimensionale Arrays und JSON machen; Postgres wirklich genießen
Timpone