0

我的查询看起来像这样,并且表现良好:

select * 
from table t 
where (t.one,t.two,t.three) in ( (11,12,13), (21,22,23) );

现在语句中这些三元组的数量in会有所不同,因此我尝试使用 JDBC 执行以下操作:

String sql = "select * from table where (one, two, three) in (select * from unnest(?::smallint[], ?::integer[], ?::integer[]))"
// conn is the java.sql.Connection
PreparedStatement ps = conn.prepareStatement(sql);
ps.setArray(1, conn.createArrayOf("smallint", new Short[]{11, 21}));
ps.setArray(2, conn.createArrayOf("integer", new Integer[]{12,22}));
ps.setArray(3, conn.createArrayOf("integer", new Integer[]{13,23}));
return ps;

这表现非常糟糕。那么有没有办法使用 jdbc 发送三元组,使得最终结果等同于 sql 查询?

我有两个 btree 索引一个上one, two一个one, three我需要使用其中的任何一个来使这个高性能

4

2 回答 2

0

我可以使用NamedParameterJdbcTemplate

String sql = "select * from table " +
        "where (one, two, three) in (:valuesMap)";

List<Integer[]> valuesMap = new ArrayList<>();
valuesMap.add(new Integer[]{11,12,13});
valuesMap.add(new Integer[]{21,22,23});
SqlParameterSource params = new MapSqlParameterSource("valuesMap", valuesMap);

return jdbc.query(sql, params, resultSetExtractor);

尽管one它是一个smallint

于 2019-10-04T04:12:16.547 回答
0

您可以创建一个复合类型,例如

CREATE TYPE triple AS (
   a smallint,
   b integer,
   c integer
);

然后你可以这样写查询:

SELECT * 
FROM t 
WHERE (t.one, t.two, t.three) = ANY (?::triple[]);

您将数组作为单个字符串提供,看起来像

{(11\,12\,13), (21\,22\,23)}

= ANY与 相同IN,但它可以与右侧的数组一起使用。

于 2019-10-03T10:44:41.410 回答