我正在尝试使用PostgreSQL IF语句,并使用MapSqlParametersSource
将参数传递给SQL查询。有趣的是,如果我将参数传递给IF条件子查询,它将不接受(正确解释)它,但如果我在子查询中定义值,那么它将给我结果。所以我的意思是:
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("recurr", true);
String sql = "DO " +
"$do$ " +
"BEGIN " +
"IF (SELECT f.recurring_till FROM FINANCE_ENTITY f WHERE f.recurring = true) THEN SELECT amount, name FROM FINANCE_ENTITY; " +
"END IF; " +
"END " +
"$do$";
getNamedParameterJdbcTemplate().query(sql, params, BeanPropertyRowMapper.newInstance(FinanceEntity.class));
这使我成功回归。
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("recurr", true);
String sql = "DO " +
"$do$ " +
"BEGIN " +
"IF (SELECT f.recurring_till FROM FINANCE_ENTITY f WHERE f.recurring = :recurr) THEN SELECT amount, name FROM FINANCE_ENTITY; " +
"END IF; " +
"END " +
"$do$";
getNamedParameterJdbcTemplate().query(sql, params, BeanPropertyRowMapper.newInstance(FinanceEntity.class));
这会让我总是出现以下错误:
org.postgresql.util.PSQLException:列索引超出范围:1,列数:0。
我的问题是为什么我无法使用MapSqlParameterSource
将参数传递给子查询?
我使用PostgreSQL 9.3。
答案 0 :(得分:2)
参数传递的问题(所以这不能直接回答你的问题)你不需要DO
语句或IF
。这项工作很简单SELECT
:
SELECT amount, name
FROM FINANCE_ENTITY
WHERE EXISTS (
SELECT 1
FROM FINANCE_ENTITY
WHERE recurring = $1
AND recurring_till
);
更重要的是,您无法从DO
语句 完全返回行 。所以你的主张“这让我成功回归”至少是一个惊喜。因为不可能: