복붙노트

[SQL] 나는 물음표를 포함 PostgreSQL을 JSON (B) 연산자를 어떻게 사용합니까? "" 를 통해 JDBC

SQL

나는 물음표를 포함 PostgreSQL을 JSON (B) 연산자를 어떻게 사용합니까? "" 를 통해 JDBC

PostgreSQL은 예 이러한 JSON 사업자를 들어, 이름에 물음표 문자를 사용 펑키 ASCII 예술 사업자의 몇 가지를 알고있다 :

문제는 공식 PostgreSQL의 JDBC 드라이버가 같은 연산자를 포함하는 올바르게 구문 분석 SQL 문자열에 보이지 않는다는 것입니다. 그것은 의문 부호가 보통 JDBC 바인드 변수라고 가정합니다. 다음 코드 ...

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

... 예외가 발생합니다 :

org.postgresql.util.PSQLException: Für den Parameter 1 wurde kein Wert angegeben.
    at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:225)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:190)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:424)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:161)
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114)

어떻게하면이 연산자를 사용할 수 있습니까?

해결법

  1. ==============================

    1.가능한 해결 방법에는 두 가지가 있습니다 :

    가능한 해결 방법에는 두 가지가 있습니다 :

    이것은 가장 간단한 해결 방법이지만, 당신은 준비된 문 (성능, 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()) {
         ...
    }
    
  2. from https://stackoverflow.com/questions/38370972/how-do-i-use-postgresql-jsonb-operators-containing-a-question-mark-via-jdb by cc-by-sa and MIT license