当前位置: 首页 > 面试题库 >

参数化表名称

毛正浩
2023-03-14
问题内容

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

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

  2. 我已经尝试过一个程序

    SET @q = CONCAT('select blabla from table_', X);
    

    PREPARE stmt FROM @q;
    EXECUTE stmt;

但是过程无法返回值,所以我需要它,因为我需要知道c_id参数化表中是否存在该值,否则就没有用了。

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

那我该怎么做才能提取这些数据呢?我从PHP调用此视图/函数/任何东西,我知道我可以从PHP端通过两个查询来做到这一点,但对于将来的实现,我需要在db端做到这一点。是否有可能?

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


问题答案:

无需动态构建查询的唯一方法是对每种组合进行硬编码,然后选择所需的组合。

如果表名是存储过程的参数,则可以在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


 类似资料:
  • 问题内容: 我正在尝试进行设置,以便将表名作为参数传递给命令文本,但是我无法使其正常工作。我四处张望,发现了这样的问题:使用C#进行MySQL的参数化查询,但是我没有任何运气。 这是相关的代码(connection == 包含连接字符串): 如果我更改: 至: 作为一种测试方法,它是可行的(我正在将XML从数据集中写入控制台以进行检查)。因此,我很确定问题只是以错误的方式使用了参数功能。有指针吗?

  • 问题内容: 我想在Postgres函数中将表名作为参数传递。我尝试了这段代码: 我得到了这个: 这是我更改为此时遇到的错误: 可能有效,因为如果没有where 得到的部分1,则表示已选定某项。为什么第一个工作和第二个工作不能同时进行?以及如何解决呢? 问题答案: 这可以进一步简化和改进: 使用架构限定名称进行调用(请参见下文): 或者: 要点 使用OUT参数简化功能。您可以直接选择动态SQL的结果

  • 问题内容: 在JUnit4中使用参数化测试时,是否可以设置自己的自定义测试用例名称? 我想将默认设置更改为有意义的设置。 问题答案: 此功能使其成为JUnit 4.11的一部分。 要使用更改参数化测试的名称,请说: 是一个字符串,可以具有以下特殊的占位符: - the index of this set of arguments. The default is . - the first para

  • 问题内容: 我在python中删除sqlite3表时遇到问题。我正在使用标准模块。 给我 当我更改为: 它工作正常。 问题答案: 您不能将参数用于表名或列名。 或者,您可以将其分为两个步骤,例如: 如果这样做,则可能要明确指定可以删除的表…

  • 问题内容: 我知道这是一个非常简单的问题,但我不知道该如何使用Google。 我能怎么做 那要用两次?我假设我必须“命名” the ,然后在参数中使用字典,但是我不确定正确的语法吗? 仅供参考,我知道我可以在参数中使用两次,但这不是重点:) 问题答案: 在Python 2.6+和Python 3中,您可以选择使用较新的字符串格式设置方法。 这样可以避免重复输入参数,或者 如果要命名参数。 这是严格

  • 问题内容: 我已经多次使用mysqli_stmt_bind_param函数。但是,如果我分开试图防止SQL注入的变量,则会遇到错误。 这是一些代码示例: 是否有可能以某种方式用另一个问号语句替换串联,制作另一个绑定参数语句或添加到现有的语句中以防止SQL注入? 像这样或某种形式: 问题答案: 对您的问题的简短回答是“否”。 从最严格的意义上讲,在数据库级别,准备好的语句仅允许将参数绑定到SQL语句