Eu tenho a seguinte tabela chamada jobs
:
id PK Serial
model String
model_id UNSIGNED Integer
status String
created_at timestamp
prosessed_at timestamp
E foreach model Id eu registro cada status em uma matriz:
select
model_id,
model,
array_agg(id) as jobs,
array_agg(statuses) as statuses
from jobs
group by model,model_id
E eu uso isso como uma subconsulta para detectar qualquer mau funcionamento em trabalhos processados:
select
*
from (
select
model_id,
model
array_agg(id) as jobs,
array_agg(statuses) as statuses
from jobs
group by model,model_id
) as jobs
where
'aborted' in statuses
and
'pending' not in statuses
and
'failed' not in statuses
and
'processed' not in statuses;
Mas na seguinte linha:
'aborted' in statuses
Tem algum erro de sintaxe de classificação:
SQL Error [42601]: ERROR: syntax error at or near "statuses"
Position: 312
Tens alguma ideia do porquê?
Você tem vários erros de sintaxe em sua consulta:
model
status
nãostatuses
in statuses
, você precisaunnest
do array assim:in (select * from unnest(statuses))
Ou isto:
in any (unnest(statuses))
Assim, sua consulta se torna:
No entanto, há uma maneira muito mais fácil de escrever isso.
Você pode usar contagens condicionais em uma
having
cláusula:Os parênteses ao redor do lado direito do argumento IN são obrigatórios. No entanto, o que vai nesses parênteses deve ser uma lista. Um array não funciona (a menos que a coisa do lado esquerdo também seja um array, então você está testando um array em uma lista de arrays). Para testar a associação da matriz, você pode usar a
'aborted'=ANY(...)
construção em vez deIN
. Mas isso tem a ver com json_agg, que você não está usando?