MySQL - 在没有现有表格的情况下使用 'case when then select' 更新字段
MySQL - Update field using 'case when then select' with no existing tables
假设一个 MySQL 5.7 数据库具有名为 myschema
的模式,其中存在 这三个 中只有一个 table:table_a
、table_b
或 table_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)
的答案的帮助下回答了这个问题
假设一个 MySQL 5.7 数据库具有名为 myschema
的模式,其中存在 这三个 中只有一个 table:table_a
、table_b
或 table_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)
的答案的帮助下回答了这个问题