gpt4 book ai didi

mysql - 参数化表名

转载 作者:数据小太阳 更新时间:2023-10-29 03:23:22 24 4
gpt4 key购买 nike

这是我的问题:我想检查名称已参数化的表中的行,例如 table_X。 X 的值来自另一个表,因此例如在我的主表中,我有一个列 c_id 和一个 X 列,要连接的表的名称为 table_X,它毫无疑问存在,并且它有我将加入的同一列 c_id,以检查该表中是否有 c_id 的值。

  1. 我试过 View ,但没有成功,因为我无法在 View 中放置参数化表名。我可以参数化 where 子句和其他东西,但不能参数化表名。

  2. 我试过一个程序,用

    SET @q = CONCAT('select blabla from table_', X);
    PREPARE stmt FROM @q;
    EXECUTE stmt;

    但是程序不能返回值,而我需要它,因为我需要知道参数化表中是否有c_id值,否则它是无用的。

    <
  3. 我尝试了一个函数,但“存储函数或触发器中不允许使用动态 SQL”

那么我可以做些什么来提取这些数据呢?我从 PHP 调用这个 View /函数/任何东西,我知道我可以从 PHP 端通过两个查询来完成,但我需要在数据库端进行,以供将来实现。可能吗?

注意:我无法修改数据库的结构 :) 顺便说一句,它是 Limesurvey db,听起来像是一个疯狂的数据库结构,是吧?

最佳答案

在不动态构建查询的情况下,唯一的方法是对每个组合进行硬编码并挑选出您想要的组合。


如果表名是存储过程的参数,则可以在 IF block 中。但感觉笨重。


如果每个表中的字段相同,您可以将这些表合并在一起并从中选择...

CREATE VIEW myUnifiedStructure AS
SELECT 'Table1' AS tableName, * FROM Table1
UNION SELECT 'Table2' AS tableName, * FROM Table2
UNION SELECT 'Table3' AS tableName, * FROM Table3
-- etc

SELECT * FROM myUnifiedStructure WHERE tableName = 'Table1'


如果每个表中的字段不同,您可能只对字段的子集感兴趣...

CREATE VIEW myUnifiedStructure AS
SELECT 'Table1' AS tableName, field1 AS field1, field4 AS field2 FROM Table1
UNION SELECT 'Table2' AS tableName, field2 AS field1, field3 AS field2 FROM Table2
UNION SELECT 'Table3' AS tableName, field2 AS field1, field4 AS field2 FROM Table3
-- etc


或者您可以为源表中不存在的字段传入 NULL...

CREATE VIEW myUnifiedStructure AS
SELECT 'Table1' AS tableName, NULL AS field1, field2 AS field2 FROM Table1
UNION SELECT 'Table2' AS tableName, field1 AS field1, field2 AS field2 FROM Table2
UNION SELECT 'Table3' AS tableName, field1 AS field1, NULL AS field2 FROM Table3
-- etc

关于mysql - 参数化表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49083528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com