sql >> Database >  >> RDS >> PostgreSQL

Hoe gebruik ik PostgreSQL JSON(B)-operators die een vraagteken bevatten? via JDBC

Er zijn twee mogelijke oplossingen:

Gebruik statische uitspraken in plaats van voorbereide uitspraken

Dit is de eenvoudigste oplossing, maar u verliest alle voordelen van voorbereide instructies (prestaties, SQL-injectiebeveiliging, enz.). Dit zal echter werken

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

Vermijd de operator. Gebruik in plaats daarvan een functie (let op:indexen worden mogelijk niet gebruikt)

Operators zijn gewoon syntaxissuiker voor een backing-functie die bestaat in de pg_catalog . Zo vindt u de naam van deze functies:

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

Bovenstaande levert:

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

De eenvoudigste oplossing is dus om niet de operator te gebruiken, maar de bijbehorende functie:

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



  1. Moet ik een rij in een relationele database verwijderen of uitschakelen?

  2. MySQL-variabelenformaat voor een NOT IN-lijst met waarden

  3. Oracle-equivalent van ROWLOCK, UPDLOCK, READPAST queryhints

  4. Hoe krijg je alle waarden in een kolom met PHP?