PostgreSQL IF 语句不接受参数
Posted
技术标签:
【中文标题】PostgreSQL IF 语句不接受参数【英文标题】:PostgreSQL IF statement won't accept parameters 【发布时间】:2016-01-28 08:21:11 【问题描述】:我正在尝试使用 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】:参数传递的问题(所以这不能直接回答你的问题)你不需要DO
语句或IF
。一个简单的SELECT
就可以完成这项工作:
SELECT amount, name
FROM FINANCE_ENTITY
WHERE EXISTS (
SELECT 1
FROM FINANCE_ENTITY
WHERE recurring = $1
AND recurring_till
);
更重要的是,您不能从 DO
语句中返回行根本。因此,您的声明“这成功返回我的结果” 至少可以说是一个惊喜。因为那是不可能:
【讨论】:
感谢您的回答。事实上,当我使用有效的那个时,我收到一个错误,上面写着“返回多行”。因此它实际上返回了一些行。 @AmirAl:不,它没有。这可能是一条 PL/pgSQL 错误消息(显然应该在您的问题开始)抱怨IF
不接受返回多于一行的表达式。如果你解决了这个问题,你会得到下一个错误,抱怨没有目标的SELECT
。我添加了一些带有更多解释的链接。
感谢这些链接,我一定会检查它们。以上是关于PostgreSQL IF 语句不接受参数的主要内容,如果未能解决你的问题,请参考以下文章
Wordpress:将 if-else 语句插入 next_post_link() / previous_post_link() 参数?
PostgreSQL模式下的h2数据库不接受PostgreSQL SQL语法
Python Flask-Restful POST不接受JSON参数