您将如何解析(这是一个简单的情况)类似的东西:${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本身做到这一点:
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;
$$
;