MySQL - 在没有现有表格的情况下使用 'case when then select' 更新字段

MySQL - Update field using 'case when then select' with no existing tables

假设一个 MySQL 5.7 数据库具有名为 myschema 的模式,其中存在 这三个 中只有一个 table:table_atable_btable_c。如果只有一个 table,例如 table_a,则以下查询将抛出 Error Code: 1146. Table 'myschema.table_b' doesn't exist.

UPDATE myschema.table_d d 
SET d.d_value = 
(CASE
    WHEN EXISTS (SELECT * 
                   FROM INFORMATION_SCHEMA.TABLES 
                  WHERE TABLE_SCHEMA = 'myschema' 
                    AND TABLE_NAME = 'table_a')
           THEN (SELECT MAX(a.a_value) 
                   FROM myschema.table_a a 
                  WHERE a.table_d_id = d.id)
    WHEN EXISTS (SELECT * 
                   FROM INFORMATION_SCHEMA.TABLES 
                  WHERE TABLE_SCHEMA = 'myschema' 
                    AND TABLE_NAME = 'table_b') 
           THEN (SELECT MAX(b.b_value) 
                   FROM myschema.table_b b 
                  WHERE b.table_d_id = d.id)
    WHEN EXISTS (SELECT * 
                   FROM INFORMATION_SCHEMA.TABLES 
                  WHERE TABLE_SCHEMA = 'myschema' 
                    AND TABLE_NAME = 'table_c')
           THEN (SELECT MAX(c.c_value) 
                   FROM myschema.table_c c 
                  WHERE c.table_d_id = d.id)
    ELSE 0
END);

所以我认为必须存在所有 table 才能执行 case when [boolean expression] then select [value] from [table] 语句。我确定吗?如果是这样,还有另一种方法吗?提前致谢。

您可以使用语句来做到这一点:

PREPARE stmt FROM 
'SELECT concat(''SELECT MAX('', replace(table_name, ''table_'', '' ''), ''_VALUE) FROM '', TABLE_NAME, '' INTO @b;'') INTO @a
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME IN (''table_a'', ''table_b'', ''table_c'')
AND TABLE_SCHEMA = ''myschema''';
EXECUTE stmt;

PREPARE stmt2 FROM @a;

UPDATE myschema.table_d d SET d.d_value = @b;

注意:我在 (How To have Dynamic SQL in MySQL Stored Procedure)

的答案的帮助下回答了这个问题