PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come si utilizzano gli operatori PostgreSQL JSON(B) contenenti un punto interrogativo? tramite JDBC

Ci sono due possibili soluzioni alternative:

Usa istruzioni statiche, invece di istruzioni preparate

Questa è la soluzione più semplice, ma perdi tutti i vantaggi delle istruzioni preparate (prestazioni, protezione SQL injection, ecc.). Tuttavia, questo funzionerà

try (Statement s = c.createStatement();
     ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
     ...
}

Evita l'operatore. Utilizzare invece una funzione (nota:gli indici potrebbero non essere utilizzati)

Gli operatori sono solo zucchero sintattico per una funzione di supporto che esiste nel pg_catalog . Ecco come trovare il nome di queste funzioni:

SELECT 
  oprname, 
  oprcode || '(' || format_type(oprleft,  NULL::integer) || ', ' 
                 || format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator 
WHERE oprname = '?|';

Quanto sopra produce:

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[])

Quindi, la soluzione più semplice consiste nel non utilizzare l'operatore, ma la funzione corrispondente:

try (PreparedStatement s = c.prepareStatement(
         "select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
     ResultSet rs = s.executeQuery()) {
     ...
}