Como diz a mensagem de erro, argumentos para
WHERE
não deve retornar um conjunto. jsonb_array_elements
retorna um conjunto e não pode ser comparado a um único valor. Na segunda consulta você tem uma junção cruzada dentro do select e isso converte em um resultado adequado para usar WHERE
sobre. Você também pode fazer assim
SELECT mydata.pk FROM mydata
WHERE 'Bob' in (SELECT jsonb_array_elements(mydata.data->'people')->>'name');
Aqui a subseleção permitirá que você use o
IN
operador para encontrar o valor desejado, pois o resultado não é mais um conjunto. Outra maneira é consultar o jsonb diretamente
SELECT mydata.pk FROM mydata
WHERE mydata.data->'people' @> '[{"name":"Bob"}]'::jsonb;
Dessa forma, você não precisa converter o jsonb em um conjunto de resultados e pesquisar dentro dele.