PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да използвам PostgreSQL JSON(B) оператори, съдържащи въпросителен знак? чрез JDBC

Има две възможни решения:

Използвайте статични оператори вместо подготвени оператори

Това е най-простото решение, но губите всички предимства от подготвените оператори (производителност, защита от SQL инжектиране и т.н.). Това обаче ще работи

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

Избягвайте оператора. Вместо това използвайте функция (забележка:индексите може да не се използват)

Операторите са просто синтактична захар за поддържаща функция, която съществува в pg_catalog . Ето как да намерите името на тези функции:

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

Горното дава:

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

И така, най-простото решение е просто да не използвате оператора, а вместо това съответната функция:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.lang.ClassNotFoundException:org.postgresql.Driver

  2. Драйвер JDBC PostgreSQL с Android

  3. Проста настройка за репликация на Slony-I.

  4. Как да разположите PostgreSQL за висока наличност

  5. Сравнение на типовете колони на базата данни в MySQL, PostgreSQL и SQLite? (Кръстосано картографиране)