【问题标题】:IF...<Sql query>....ELSE IF ....<Sql query>...ElseIF...<Sql 查询>....ELSE IF ....<Sql 查询>...Else
【发布时间】:2017-11-13 04:44:58
【问题描述】:

我正在尝试通过为 Postgresql 编写带有 if 条件的查询来在 NamedParameterJdbcTemplate 中使用查询。

我将向查询、store 和 tot_store 传递 2 个参数。我尝试了以下查询,但它不起作用。有什么建议吗?

IF (:store=1)
BEGIN 
    SELECT * FROM store_pricing WHERE store = :store and tot_store = :tot_store ORDER BY store asc;
END
ELSE IF (:store = 2)
BEGIN
    SELECT * FROM store_pricing WHERE store = :store and tot_store = :tot_store ORDER BY store asc;
END
ELSE
BEGIN
    SELECT * FROM store_pricing WHERE store = :store and tot_store = :tot_store ORDER BY store desc;
END

错误提示

syntax error at or near "IF"

提前谢谢你

【问题讨论】:

  • 你遇到了什么错误?
  • 我在上面的问题中添加了错误。

标签: java sql postgresql spring-jdbc


【解决方案1】:

PostgreSQL 不接受 IF 作为顶级语句。它也不是 SQL 标准。

使用CASE ... WHEN ...

IFPL/PgSQL 代码块中是允许的,不过;见DOCREATE FUNCTION

在这种情况下,我会编写一条 SQL 语句并

ORDER BY
  CASE WHEN store IN (1,2) THEN -store
  ELSE store
  END DESC

(未经测试)

【讨论】:

    【解决方案2】:

    如果您使用的是 Mysql,您的代码中有不正确的 IF 语句。 正确的 IF 语法:

    IF search_condition THEN statement_list
        [ELSEIF search_condition THEN statement_list] ...
        [ELSE statement_list]
    END IF
    

    你需要去掉括号并将 THEN 放在条件之后。

    比如你可以写这样的存储过程:

    DELIMITER //
    
    CREATE FUNCTION SimpleCompare(n INT, m INT)
      RETURNS VARCHAR(20)
    
      BEGIN
        DECLARE s VARCHAR(20);
    
        IF n > m THEN SET s = '>';
        ELSEIF n = m THEN SET s = '=';
        ELSE SET s = '<';
        END IF;
    
        SET s = CONCAT(n, ' ', s, ' ', m);
    
        RETURN s;
      END //
    
    DELIMITER ;
    

    注意,在 Mysql 中还有另一个 IF。它是一个可以在 select 语句中使用的函数。

    官方文档:https://dev.mysql.com/doc/refman/5.7/en/if.html

    【讨论】:

    • 我正在为 postgresql 编写查询。我在我的问题中添加了这一点。
    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多