sql >> データベース >  >> RDS >> PostgreSQL

疑問符を含むPostgreSQLJSON(B)演算子を使用するにはどうすればよいですか? JDBC経由

    考えられる回避策は2つあります。

    プリペアドステートメントの代わりに静的ステートメントを使用する

    これは最も簡単な回避策ですが、プリペアドステートメントからのすべての利点(パフォーマンス、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. SQLServerのテーブルで使用されているスペースを確認してください

    2. SQLServerデータベースレプリケーション

    3. PostgreSQLの入出力(I / O)操作の調整

    4. MySQLデータベースのテーブルのサイズを取得するにはどうすればよいですか?