【问题标题】:How do I run a CONCAT on query stored in a database如何对存储在数据库中的查询运行 CONCAT
【发布时间】:2013-03-18 16:13:00
【问题描述】:

我知道这是一个不好的例子,但我正在尝试简化事情,所以请耐心等待我编写这段代码的迂回方式。假设我将查询存储在数据库中,例如

查询表

id    query
1     concat('SELECT * FROM table1 WHERE year = ', _year, 'order by name')
2     concat('SELECT * FROM table2 WHERE year = ', _year, 'order by name')

我想运行以下例程

DECLARE _year;
SET _year= "2013";
SET @SQL = (SELECT query FROM queries WHERE id = 1);    
PREPARE stmt FROM @SQL;
EXECUTE stmt; 

这是我目前拥有的,但它不起作用。我正在尝试从数据库中选择一个查询,将一些变量传递给它,然后运行查询。

【问题讨论】:

  • MySQL 不允许在存储过程中使用动态 SQL。
  • 那么任何人都可以用不同的方式为我指明正确的方向,但仍然需要在数据库中存储查询和变量,然后从中构建语句。

标签: mysql concat


【解决方案1】:

如果可以提前确定您的查询,特定参数除外,那么您可以考虑使用带有判别式的 UNION 查询。然后,使用您的查询表选择联合中的特定查询并将参数应用到它们。查询本身是在数据库的视图中定义的。

大多数 DBMS 中的 SQL 都不是动态的,试图颠覆这一点几乎肯定会导致性能下降和潜在的安全问题。

CREATE VIEW UnionView
AS SELECT *, 1 as Type, Value1 AS Param FROM Table1 
UNION ALL SELECT *, 2 as Type, Value2 AS Param FROM Table1
UNION ALL SELECT *, 3 as Type, Value3 AS Param FROM Table1;

SELECT * FROM UnionView WHERE Type = 2 AND Param = 2;

请参阅SqlFiddle 以获取演示该行为的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2020-11-12
    相关资源
    最近更新 更多