sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur använder jag PostgreSQL JSON(B)-operatorer som innehåller ett frågetecken? via JDBC

Det finns två möjliga lösningar:

Använd statiska satser istället för förberedda satser

Detta är den enklaste lösningen, men du förlorar alla fördelar från förberedda uttalanden (prestanda, SQL-injektionsskydd, etc.). Detta kommer dock att fungera

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

Undvik operatören. Använd en funktion istället (obs! index kanske inte används)

Operatörer är bara syntax sugar för en stödfunktion som finns i pg_catalog . Så här hittar du namnet på dessa funktioner:

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

Ovanstående ger:

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

Så den enklaste lösningen är att inte använda operatorn, utan motsvarande funktion istället:

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



  1. ER-diagram i IRI Workbench

  2. Räknar antalet förekomster av en delsträng i en sträng i PostgreSQL

  3. Ostrukturerat innehåll:en outnyttjad bränslekälla för AI och maskininlärning

  4. Java Multicast Time To Live är alltid 0