Esta consulta não está funcionando, mas o erro não faz sentido
SELECT count(*) FROM t
WHERE json_typeof(info->'vatids')='array' AND json_array_length(info->'vatids')>1;
ERRO: não é possível obter o tamanho do array de um escalar
PS: idem com JSONb.
Você não nos mostrou os dados que estão nessa coluna nem nos mostrou a definição da tabela. Mas acho que você tem algo assim:
Não há "curto-circuito" de condições no SQL, todas as condições na cláusula WHERE são aplicadas (logicamente) ao mesmo tempo, portanto
json_array_length(info->'vatids')
, falhará na terceira linha, mesmo que vocêjson_typeof(info->'vatids')='array'
também tenha.O seguinte também não funcionará, porque o otimizador é inteligente o suficiente para enviar a condição para a tabela derivada:
Nesse caso, você precisa de um CTE que filtre completamente as linhas inválidas, só então você pode aplicar a condição no comprimento do array:
Isso funciona porque os CTEs no Postgres atuam como uma cerca de otimização e, portanto, as condições da consulta externa não são enviadas para o CTE. Na maioria das vezes isso é uma desvantagem, mas neste caso é realmente útil.