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

Como uso operadores PostgreSQL JSON(B) contendo um ponto de interrogação? via JDBC


Existem duas soluções possíveis:

Use declarações estáticas, em vez de declarações preparadas


Esta é a solução mais simples, mas você perde todos os benefícios das instruções preparadas (desempenho, proteção de injeção de SQL, etc.). No entanto, isso funcionará
try (Statement s = c.createStatement();
     ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
     ...
}

Evite o operador. Use uma função (nota:índices podem não ser usados)


Os operadores são apenas açúcar de sintaxe para uma função de apoio que existe no pg_catalog . Veja como encontrar o nome dessas funções:
SELECT 
  oprname, 
  oprcode || '(' || format_type(oprleft,  NULL::integer) || ', ' 
                 || format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator 
WHERE oprname = '?|';

O rendimento acima:
Função
oprname  function
----------------------------------------------------------------------------------
?|       point_vert(point, point)
?|       lseg_vertical(-, lseg)
?|       line_vertical(-, line)
?|       jsonb_exists_any(jsonb, text[])    <--- this is the one we're looking for
?|       exists_any(hstore, text[])

Portanto, a solução mais simples é não usar o operador, mas a função correspondente:
try (PreparedStatement s = c.prepareStatement(
         "select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
     ResultSet rs = s.executeQuery()) {
     ...
}