0

当我尝试在存储过程中使用 IF Else 条件时,出现语法错误

您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 'sortby = 1 THEN value2, value3 ASC; 附近使用的正确语法;

根据 MySQL 文档,语法是

IF condition THEN
    statements;
ELSE
    else-statements;
END IF;

我的存储过程:

DELIMITER $$
      CREATE PROCEDURE test(IN _code  INT, IN testformat SMALLINT(5), IN testcurrency CHAR, IN testdate Date, IN tesval CHAR(1),  IN sortby INT)
      BEGIN
           SELECT   value1, valu2, value3, value4
           FROM     shop    
           WHERE     CODE1  = _code 
           ORDER BY  
          IF  sortby = 1  THEN
             value2, value3 ASC;
          ELSE 
            value2, value3 DESC;
         END;
     END$$
DELIMITER ; 

我找不到问题。谢谢你的帮助。

4

1 回答 1

1

IF/THEN/ELSE结构本身就是一个声明。它不是您可以放在ORDER BY查询子句中的表达式。

但是您不能使用该IF(condition, expr1, expr2)函数,因为该函数必须返回一个标量,而不是列列表和 SQL 关键字。

您的问题的解决方案是:

DELIMITER $$
  CREATE PROCEDURE test(
    IN _code  INT, 
    IN testformat SMALLINT(5), 
    IN testcurrency CHAR, 
    IN testdate Date, 
    IN tesval CHAR(1),
    IN sortby INT)
  BEGIN
    IF sortby = 1 THEN
       SELECT   value1, valu2, value3, value4
       FROM     shop    
       WHERE     CODE1  = _code 
       ORDER BY value2, value3 ASC;
    ELSE
       SELECT   value1, valu2, value3, value4
       FROM     shop    
       WHERE     CODE1  = _code 
       ORDER BY value2, value3 DESC;
    END IF;
  END$$
DELIMITER ; 

由于唯一的区别是 SQL 关键字(不是值),因此缩短它的唯一方法是使用动态 SQL:

DELIMITER $$
  CREATE PROCEDURE test(
    IN _code  INT, 
    IN testformat SMALLINT(5), 
    IN testcurrency CHAR, 
    IN testdate Date, 
    IN tesval CHAR(1),
    IN sortby INT)
  BEGIN
    SET @query = CONCAT('
       SELECT   value1, valu2, value3, value4
       FROM     shop    
       WHERE     CODE1  = _code 
       ORDER BY value2, value3 ', IF(sortby=1, 'ASC', 'DESC'));
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
  END$$
DELIMITER ; 
于 2021-02-17T18:37:20.490 回答