【问题标题】:MariaDB to calculate table reference in select queryMariaDB 在选择查询中计算表引用
【发布时间】:2020-11-06 10:36:04
【问题描述】:

我有一个非常愚蠢的客户端应用程序,它想根据参数从 MariaDB 获取信息。 此参数是一个包含空格的字符串,例如“有效参数”。 在 MariaDB 中,每个可能的字符串值都有一个表,表名是空格被下划线替换并添加前缀后的字符串值。所以我可以像这样执行必要的转换:

SELECT CONCAT('prefix_', REPLACE('valid parameter',' ','_'));

现在结果'prefix_valid_parameter'是要查询的表,所以实际上我需要启动

SELECT * from CONCAT('prefix_', REPLACE('valid parameter',' ','_'));

但 MariaDB 的响应是

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '('prefix_', REPLACE('valid parameter',' ','_'))' at line 1

我本来预计表'prefix_valid_parameter'的内容或错误说明“未找到表'prefix_valid_parameter'”。如何使我的SQL SELECT statement 的 table_reference 部分动态化?

【问题讨论】:

    标签: sql mariadb


    【解决方案1】:

    你需要使用动态SQL:

    set @sql = 'select * from [table]';
    
    execute immediate replace(@sql, '[table]',
                              concat('prefix_', replace('valid parameter', ' ', '_'))
                             );
    

    我应该补充一点,需要这样做可能表明您的数据模型存在缺陷。如果表结构相同,最好将所有行放在一个表中。

    【讨论】:

    • 这些表有一些共同的列,但大部分都是特殊的。因此决定将 放在单独的表中。
    • 它适用于适当的 SQL 客户端。但是大声喊叫:我的愚蠢客户端是 Grafana,这个客户端既不能自己操作字符串值 (github.com/grafana/grafana/issues/8259),也不能使用动态 SQL 将作业传递给 MariaDB (github.com/grafana/grafana/issues/8755)。我无语了。
    • @HiranChaudhuri 。 . .也许你应该问另一个关于 Grafana 和动态 SQL 的问题。
    • 我已经将我的 cmets 放在了两个相关的 github 条目上——我上面的评论中都引用了这两个条目。不过谢谢你的提示。 :-)
    猜你喜欢
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2019-04-16
    • 2019-12-03
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多