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)