如何从算术关系生成SQL查询

问题描述 投票:0回答:1

您将如何解析(这是一个简单的情况)类似的东西:${table_1} + ${table_2} + ${table_3}并生成一个SQL查询,如:

WITH TMP_1 AS (SELECT date, quantity FROM table_1), TMP_2 AS (SELECT date, quantity FROM table_2), TMP_3 AS (SELECT date, quantity FROM table_3)
SELECT time_bucket('1 day', date) AS date, sum(quantity) AS sum FROM ( SELECT date, quantity FROM TMP_1 UNION ALL SELECT date, quantity FROM TMP_2 UNION ALL SELECT date, quantity FROM TMP_3 ) AS res_1 GROUP BY 1 ORDER BY 1;

您知道任何可以转换为SQL查询的伪语言吗?

更新1

关系可以根据用户输入而改变:${table_1} + ${table_2} * ( ${table_3} * 60 )

sql postgresql
1个回答
0
投票

你可以用sql本身做到这一点:

do
$$
declare
 _i text;
 _r text;
begin
 _i := '${table_1} + ${table_2} + ${table_3}';
 _r := (
   with u as (select * from unnest(string_to_array(_i,'+')) with ordinality t(e,o))
  , c as (select format('TMP_%s AS (SELECT date, quantity FROM %I)'
  , o
  , substring(unnest(string_to_array(e,'+')) from '\{(.+)\}')
  ) from u
)
select string_agg(format,','||chr(10)) from c);
 _r := 'WITH '||chr(10)||_r||chr(10)||$s$SELECT time_bucket('1 day', date) AS date,
    sum(quantity) AS sum FROM
    (
    SELECT date, quantity FROM TMP_1
    UNION ALL
    SELECT date, quantity FROM TMP_2
    UNION ALL
    SELECT date, quantity FROM TMP_3
    ) AS res_1
  GROUP BY 1
  ORDER BY 1;$s$;
 raise info '%',_r;
 execute _r;
end;
$$
;
© www.soinside.com 2019 - 2024. All rights reserved.