Mysql IF语句嵌套if语句错误

时间:2020-10-30 14:39:05

标签: mysql sql if-statement mariadb

我正在尝试创建一个过程来更新stopTime表上的works字段。 我正在使用的查询是:

update  mydb.works  set stopTime= 
(IF((SELECT table_name FROM information_schema.tables WHERE table_schema = 'mydb' AND table_name = 'results_24') is NULL, 
(select stampTime from mydb.works where id = 24), 
(IFNULL((select stampTime from mydb.results_24 order by id desc limit 1),
(select stampTime from mydb.works where id = 24))))) where id=24;

简短地,查询应获取相关的results_stampTime作为stopTime表的相关条目的works。 如果没有表或表为空,则使用stampTime表中的works

当我没有寻找的results_表时,就会发生我的问题。该语句应检查相关的results_*表是否存在,如果不存在,则应从stampTime表中获取works

但是它也会执行以下语句(即ELSE部分)

IFNULL((select stampTime from mydb.results_24 order by id desc limit 1)

我得到了错误(按预期)

ERROR 1146 (42S02): Table 'mydb.results_24' doesn't exist

我多次检查了括号和逗号。我认为这没有错误。 我想念什么?它不应该执行ELSE部分,但是可以执行。为什么?

谢谢。

OS: Raspbian

Mysql version: Mysql Ver 15.1 Distrib 10.3.22-MariaDB, for debian-linux-gnueabihf (armv8l) using readline 5.2

1 个答案:

答案 0 :(得分:0)

就像GMB所说的那样,您需要一些动态sql

SELECT IF (EXISTS(SELECT 1 FROM information_schema.tables WHERE table_schema = 'mydb' AND table_name = 'results_24')
,@sql := 'update  mydb.works  set stopTime = IFNULL((select stampTime from mydb.results_24 order by id desc limit 1)
   ,(select stampTime from mydb.works where id = 24));'
   ,@sql := 'update  mydb.works  set stopTime = (select stampTime from mydb.works where id = 24);');
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;