Eu tenho uma consulta como esta:
select id, array_length(users_who_like_ids,1) as ct
from queryables
order by 2 desc;
Mas matrizes vazias (sem elementos) são classificadas no topo. Prefiro array_length()
retornar 0 para esse caso, para que isso seja classificado na parte inferior.
Provavelmente não estou entendendo array_length()
(ok, definitivamente), mas:
embers_dev2=# select array_length(array[1,2], 1), array_length(ARRAY[]::integer[],1);
deve retornar 0 ao invés de nada (NULL), certo?
Eu poderia fazer uma declaração if como inline nele?
Editar
De acordo com esta resposta relacionada no SO, parece que COALESCE
pode ser o que eu quero - mas estou aberto a ideias melhores:
Está em debate o que isso deve retornar. Mas da maneira como o Postgres o define, o resultado para qualquer dimensão que não existe é NULL.
COALESCE
é a ferramenta para corrigir sua consulta, mas a melhor solução é não quebrá-la para começar.Alternativa no Postgres 9.4
O Postgres 9.4 ou posterior fornece uma função separada
cardinality()
que , de acordo com a documentação:Ênfase em negrito minha.
Parece que você lida exclusivamente com arrays unidimensionais e só quer usar isso .
No entanto, esta ainda não é a solução adequada para o seu problema. A matriz inteira pode ser NULL, que retorna NULL de qualquer maneira e ainda classifica no topo.
Corrigir consulta com
NULLS LAST
Isso sempre lida com valores NULL corretamente. Você ainda pode querer usar
cardinality()
para classificar matrizes vazias antes de NULL. Mas esteja ciente da diferença ao lidar com arrays multidimensionais.