it-swarm.com.de

So überprüfen Sie, ob ein Array in Postgres leer ist

Ich habe eine Postgres-Funktion:

CREATE OR REPLACE FUNCTION get_stats(
    _start_date timestamp with time zone,
    _stop_date timestamp with time zone,
    id_clients integer[],
    OUT date timestamp with time zone,
    OUT profit,
    OUT cost
)
RETURNS SETOF record
LANGUAGE plpgsql
AS $$
DECLARE
    query varchar := '';
BEGIN
... -- lot of code
IF id_clients IS NOT NULL THEN
    query := query||' AND id = ANY ('||quote_nullable(id_clients)||')';
END IF;
... -- other code
END;
$$;

Wenn ich also eine Abfrage wie diese ausführe:

SELECT * FROM get_stats('2014-07-01 00:00:00Etc/GMT-3'
                      , '2014-08-06 23:59:59Etc/GMT-3', '{}');

Die generierte Abfrage hat folgende Bedingung:

"... AND id = ANY('{}')..."

Wenn jedoch ein Array leer ist, sollte diese Bedingung nicht in der Abfrage dargestellt werden.
Wie kann ich überprüfen, ob das Array von Clients nicht leer ist?

Ich habe auch zwei Varianten ausprobiert:

IF ARRAY_UPPER(id_clients) IS NOT NULL THEN
    query := query||' AND id = ANY ('||quote_nullable(id_clients)||')';
END IF;

Und:

IF ARRAY_LENGTH(id_clients) THEN
    query := query||' AND id = ANY ('||quote_nullable(id_clients)||')';
END IF;

In beiden Fällen habe ich diesen Fehler erhalten: ARRAY_UPPER(ARRAY_LENGTH) doesn't exists;

29
joni jones

array_length() erfordert zwei Parameter, wobei der zweite die Dimension des Arrays ist:

array_length(id_clients, 1) > 0

So:

IF array_length(id_clients, 1) > 0 THEN
    query := query || format(' AND id = ANY(%L))', id_clients);
END IF;

Dies schließt sowohl das leere Array als auch NULL aus.


Wenn Sie jedoch eine Abfrage zur Ausführung mit EXECUTE verketten, ist es sinnvoller, Werte mit einer USING -Klausel zu übergeben. Beispiele:


Übrigens, um explizit zu überprüfen, ob ein Array leer ist (wie Ihr Titel sagt - aber das ist nicht was du hier brauchst) vergleiche es einfach mit einem leeren Array:

id_clients = '{}'

Das ist alles. Du erhältst:

TRUE .. Array ist leer
Array NULL .. ist NULL
FALSE .. in jedem anderen Fall (Array enthält Elemente - auch wenn es sich nur um NULL-Elemente handelt)

51

wenn Sie aus irgendeinem Grund die Dimension des Arrays nicht angeben möchten, gibt cardinality für ein leeres Array 0 zurück:

Aus den Dokumenten:

cardinality (anyarray) gibt die Gesamtzahl der Elemente im Array zurück oder 0, wenn das Array leer ist

15
bronzenose