web-dev-qa-db-fra.com

Comment vérifier si un tableau est vide dans Postgres

J'ai une fonction Postgres:

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

Donc, si je lance une requête quelque chose comme ceci:

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

La requête générée a cette condition:

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

Mais si un tableau est vide, cette condition ne doit pas être représentée dans la requête.
Comment puis-je vérifier si le tableau de clients n'est pas vide?

J'ai également essayé deux variantes:

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

Et:

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

Dans les deux cas, j'ai eu cette erreur: ARRAY_UPPER(ARRAY_LENGTH) doesn't exists;

29
joni jones

array_length() nécessite deux paramètres, le second étant la dimension du tableau:

array_length(id_clients, 1) > 0

Alors:

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

Cela exclut à la fois le tableau vide et NULL.


Mais si vous concaténez une requête à exécuter avec EXECUTE, il serait plus intelligent de passer des valeurs avec une clause USING. Exemples:


BTW, pour vérifier explicitement si un tableau est vide (comme le dit votre titre - mais c'est pas ce dont vous avez besoin ici) il suffit de le comparer à un tableau vide:

id_clients = '{}'

C'est tout. Vous recevez:

TRUE .. le tableau est vide
NULL .. tableau est NULL
FALSE .. tout autre cas (le tableau a des éléments - même si ce n'est que des éléments NULL)

51
Erwin Brandstetter

si pour une raison quelconque vous ne voulez pas fournir la dimension du tableau, cardinality renverra 0 pour un tableau vide:

De la documentation:

cardinalité (anyarray) renvoie le nombre total d'éléments dans le tableau, ou 0 si le tableau est vide

15
bronzenose