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 语句中返回行根本。因此,您的声明“这成功返回我的结果” 至少可以说是一个惊喜。因为那是不可能

How to perform a select query in a DO block? PostgreSQL Function PERFORM

【讨论】:

感谢您的回答。事实上,当我使用有效的那个时,我收到一个错误,上面写着“返回多行”。因此它实际上返回了一些行。 @AmirAl:不,它没有。这可能是一条 PL/pgSQL 错误消息(显然应该在您的问题开始)抱怨IF 不接受返回多于一行的表达式。如果你解决了这个问题,你会得到下一个错误,抱怨没有目标的SELECT。我添加了一些带有更多解释的链接。 感谢这些链接,我一定会检查它们。

以上是关于PostgreSQL IF 语句不接受参数的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress:将 if-else 语句插入 next_post_link() / previous_post_link() 参数?

PostgreSQL模式下的h2数据库不接受PostgreSQL SQL语法

为啥我的 If 语句在 PHP 中接受不正确的字符串条件?

Python Flask-Restful POST不接受JSON参数

postgreSQL 在 select 语句中的 if 语句中声明 var

PHP PDO 语句可以接受表名或列名作为参数吗?