PostgreSQL IF语句不接受参数

时间:2016-01-28 08:21:11

标签: java spring postgresql jdbc plpgsql

我正在尝试使用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。

1 个答案:

答案 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语句 完全返回行 。所以你的主张“这让我成功回归”至少是一个惊喜。因为不可能