【问题标题】:How to set the result of a query as a queryable table?如何将查询结果设置为可查询表?
【发布时间】:2019-12-29 18:01:24
【问题描述】:

我正在尝试将查询结果用作表格。

这个查询工作正常:

SELECT date, number FROM `table_A`

下面的查询也是 --> 它的结果是 table_B 作为字符串而不是表本身

SELECT nametable FROM `list_repository` WHERE id=1

但是组合的没有:

SELECT date, number FROM (SELECT nametable FROM `list_repository` WHERE id=1) A 

我希望得到的查询是

SELECT date, number FROM `table_B`

我尝试设置一个变量,但它也不起作用

DECLARE x VARCHAR(150) ;
SET table=( SELECT `nametable` FROM `list_repository` WHERE id=1);
SELECT * from `table`. But it would not work

感谢您的帮助!

【问题讨论】:

  • Table_B 是否包含datenumber 列?
  • 是的,它确实包含请求的列。
  • 我会搜索 “MySQL 中的动态 SQL”。您尝试做的事情很常见,但是您必须将整个查询编写为准备好的语句(字符串),然后执行它。如果查询包含用户输入,请记住安全问题。
  • 请注意,此类问题可能是架构设计不佳的症状

标签: mysql select datatable


【解决方案1】:

SQL 中的标识符(数据库、表、列名等)是静态的。因此,您不能在运行时填充它们。但是您可以将查询构建为字符串并通过dynamic SQL 执行它。类似于

SET @sql = NULL;

SELECT CONCAT("SELECT * FROM ", nametable)
  INTO @sql
  FROM list_repository
 WHERE id = 1;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

将其包装到存储过程中的示例

DELIMITER //
CREATE PROCEDURE sp1 (IN id INT)
BEGIN
  SET @sql = NULL;
  SELECT CONCAT("SELECT * FROM ", nametable)
    INTO @sql
    FROM list_repository
   WHERE id = id;
  SELECT @sql;
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END//

然后调用它

CALL sp1(1);

【讨论】:

  • 谢谢彼得。我正在使用 MYSQL。这也适用吗?在 BEGIN 之后,我应该在代码中的哪个位置插入它?
  • 是的,它是 MySQL。
  • 答案太笼统,无法解决我的问题。谁能说的更具体一点?
  • 给出的答案完全涵盖了您的原始问题,然后是一些。如果您有不同的问题或不知道如何在您的特定上下文中应用给定的答案,请在 SO 上创建一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多