MySQL存储过程:IF THEN中的布尔逻辑

时间:2010-05-12 18:17:38

标签: sql mysql stored-procedures

我正在寻找在IF THEN语句中使用逻辑运算符的正确语法(如果在MySQL存储过程中这是可能的)。这是我想做的事情,但我不确定是否应该键入“OR”或“||”在IF ... THEN条款:

DELIMITER $$

CREATE PROCEDURE `MyStoredProc` (_id INT)
BEGIN

  DECLARE testVal1 INT DEFAULT 0;
  DECLARE testVal2 INT DEFAULT 0;

  SELECT value1, value2 INTO testVal1, testVal2 
    FROM ValueTable 
   WHERE id = _id;

 IF testVal1 > 0 OR testVal2 > 0 THEN

   UPDATE ValueTable 
      SET value1 = (value1+1) 
    WHERE id=_id;

 END IF;

END$$

4 个答案:

答案 0 :(得分:1)

我刚试过你的程序以确保它有效,而且确实如此。此外,您应该考虑指定变量类型的长度,例如。 INT(10)。

OR || 运算符都是正确的(如Reference Manual中所述)。

答案 1 :(得分:0)

我没有尝试使用存储过程,但“或”适用于触发器。这是一些当前生产代码中的工作片段:

CREATE TRIGGER `update_inventory` AFTER INSERT ON `order_updates` FOR EACH ROW 
begin
   if new.type = 'received' or new.type = 'used' or new.type = 'returned' then 
...

答案 2 :(得分:0)

我认为您应该更改代码以处理NULL值的可能性(这可能是您遇到的错误的隐藏原因)。

例如:

IF (testVal1 IS NOT NULL AND testVal1 > 0) OR (testVal2 IS NOT NULL AND testVal2 > 0) THEN

   UPDATE ValueTable 
      SET value1 = (value1+1) 
    WHERE id=_id;

 END IF;

答案 3 :(得分:0)

尽管||和或会导致相同的结果 在您提供的情况下,OR更好,因为 ||一致受sql_mode影响。这是荒谬的 OR的结果为false且||的结果为示例是真的。 (我使用的客户端不需要定界符语句,但是如果您有常规的mysql客户端,那么您将知道在何处添加它们。)

set @or1='false';
set @or2='false';
set sql_mode='db2';
drop procedure p;
create procedure p()
begin
  declare a char default 'a';
  if a > 0 || a = 0 then set @or1 = 'true'; end if;
  if a > 0 or a = 0 then set @or2 = 'true'; end if;
end;
call p();
select @or1,@or2;