PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment utiliser les opérateurs PostgreSQL JSON(B) contenant un point d'interrogation ? par JDBC

Il existe deux solutions possibles :

Utilisez des instructions statiques au lieu d'instructions préparées

C'est la solution de contournement la plus simple, mais vous perdez tous les avantages des instructions préparées (performances, protection contre les injections SQL, etc.). Cependant, cela fonctionnera

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

Évitez l'opérateur. Utilisez une fonction à la place (remarque :les index peuvent ne pas être utilisés)

Les opérateurs ne sont que du sucre de syntaxe pour une fonction de sauvegarde qui existe dans le pg_catalog . Voici comment trouver le nom de ces fonctions :

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

Les rendements ci-dessus :

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

Ainsi, la solution de contournement la plus simple consiste à ne pas utiliser l'opérateur, mais la fonction correspondante à la place :

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