我正在尝试创建一个过程来更新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
答案 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;