array_length()
kräver två parametrar, den andra är dimensionen för arrayen:
array_length(id_clients, 1) > 0
Så:
IF array_length(id_clients, 1) > 0 THEN
query := query || format(' AND id = ANY(%L))', id_clients);
END IF;
Detta utesluter både tom array och NULL.
Eller använd cardinality()
i Postgres 9.4 eller senare. Se tillagt svar av @bronzenose.
Men om du sammanfogar en fråga som ska köras med EXECUTE
, skulle det vara smartare att skicka värden med en USING
klausul. Exempel:
- Multirow subselect som parameter för att "köra med"
- Hur man använder EXECUTE FORMAT ... USING i postgres-funktionen
BTW, för att uttryckligen kontrollera om en array är tom (som din rubrik säger - men det är inte vad du behöver här) jämför bara det med en tom array:
id_clients = '{}'
Det är allt. Du får:
TRUE
.. arrayen är tomNULL
.. matrisen är NULLFALSE
.. alla andra fall (arrayen har element - även om bara NULL-element)