参数化表名

时间:2011-10-04 15:00:15

标签: mysql sql parameterized

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

  1. 我尝试了一个视图,但没有成功,因为我无法在视图中放置参数化表名。我可以参数化子句和其他内容,但没有表名。

  2. 我尝试了一个程序,

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

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

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

  4. 那么我该怎么做才能提取这些数据呢?我正在调用这个视图/函数/来自PHP的任何东西,我知道我可以从PHP端执行它,有两个查询,但我需要做db-side,以便将来实现。 有可能吗?

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

2 个答案:

答案 0 :(得分:2)

为什么你需要这样的单独表?这通常是糟糕设计的标志。为记录所属的X`值创建一个带有标识符字段的单个表,您可以加入/过滤它吗?

这会将查询缩减为类似

的内容
SELECT ...
FROM othertable
JOIN bigtable ON othertable.c_id = bigtable.c_id AND othertable.fieldName = bigtable.fieldName

答案 1 :(得分:2)

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


如果表名是存储过程的参数,则可以使用IF块。但它感觉笨重。


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

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