我正在寻找在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$$
答案 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;