sql >> Databáze >  >> RDS >> PostgreSQL

Jak mohu použít operátory PostgreSQL JSON(B) obsahující otazník? přes JDBC

Existují dvě možná řešení:

Používejte statické příkazy místo připravených příkazů

Toto je nejjednodušší řešení, ale přijdete o všechny výhody připravených příkazů (výkon, ochrana SQL injection atd.). To však bude fungovat

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

Vyhýbejte se operátorovi. Použijte místo toho funkci (poznámka:indexy nemusí být použity)

Operátory jsou pouze syntaktický cukr pro podpůrnou funkci, která existuje v pg_catalog . Zde je návod, jak najít název těchto funkcí:

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

Výše uvedené výnosy:

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

Nejjednodušším řešením je tedy nepoužít operátor, ale místo něj odpovídající funkci:

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



  1. Kritéria hibernace pro data

  2. Proč nejsou agregační funkce povoleny v klauzuli where

  3. Generování sekvence v pořadí

  4. Jak funguje TIMESTAMPADD() v MariaDB