嵌套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;