ホームページ >データベース >mysql チュートリアル >PostgreSQL の JSON(B) 演算子を「?」で使用する方法JDBCでは?
PostgreSQL は、キーの存在には ?、配列文字列の存在には ?| など、名前に疑問符が含まれています。 PostgreSQL JDBC ドライバーは、これらの演算子を含む SQL 文字列の解析で問題が発生し、それらの演算子を JDBC バインド変数として誤って解釈します。
正常に利用するにはJDBC のこれらの演算子については、次の点を考慮してください。回避策:
try (Statement s = c.createStatement(); ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) { ... }この基本的な回避策では、準備されたステートメントの使用が排除され、SQL 文字列を静的ステートメントとして実行できるようになります。
SELECT oprname, oprcode || '(' || format_type(oprleft, NULL::integer) || ', ' || format_type(oprright, NULL::integer) || ')' AS function FROM pg_operator WHERE oprname = '?|';演算子は基本的に、pg_catalog 内のバッキング関数の構文別名です。関数名を識別すると、それを直接使用できます。例:
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()) { ... }回避策としては、演算子を対応する関数に置き換えます:
以上がPostgreSQL の JSON(B) 演算子を「?」で使用する方法JDBCでは?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。