嵌套IF语句上的Mysql IF语句错误

嵌套IF语句上的Mysql IF语句错误,mysql,sql,if-statement,mariadb,Mysql,Sql,If Statement,Mariadb,我正在尝试创建一个过程来更新我的works表上的stopTime字段。 我使用的查询是: 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

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

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;
很快,查询将获得相关的
结果
stampTime
作为
works的
stopTime
。 如果没有表或空表,则使用
工作
表中的
stampTime

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

但它也执行下面的语句(即:ELSE部分)

我得到了错误(正如预期的那样)

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

谢谢

OS:Raspbian


Mysql版本:Mysql版本15.1发行版10.3.22-MariaDB,适用于debian linux gnueabihf(armv8l),使用readline 5.2

就像GMB alsready说的那样,您需要一些动态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;

就像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;

您需要在此处使用动态SQL。您需要在此处使用动态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;