PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Encontrando a posição de um valor em arrays do PostgreSQL


A recomendações de documentação usando o generate_subscripts função. A função abaixo emular o array_search do PHP :
CREATE FUNCTION array_search(needle ANYELEMENT, haystack ANYARRAY)
RETURNS INT AS $$
    SELECT i
      FROM generate_subscripts($2, 1) AS i
     WHERE $2[i] = $1
  ORDER BY i
$$ LANGUAGE sql STABLE;

Isso retorna o índice da primeira correspondência, se presente. Se você quiser todas as correspondências, basta alterar RETURNS INT para RETURNS SETOF INT . Esta função, como está, retorna NULL se nenhuma correspondência for encontrada.

Esta função só funciona com arrays unidimensionais.

Além disso, tenha em mente que array_search(NULL, a) sempre retorna NULL , mesmo que a matriz contenha elementos nulos:
> SELECT array_search(null, array[1, 2, null, 4]);
 array_search 
--------------

(1 row)

Isso ocorre porque o SQL considera NULL = NULL ser desconhecido (ou seja, NULL ). Consulte comparação de funções . Se você quiser array_search para encontrar NULL elementos, mudança
     WHERE $2[i] = $1

para
     WHERE $2[i] IS NOT DISTINCT FROM $1