-1

我正在寻找将解析的结构转换为 PostgreSQL。希望我问的正确。

是否已经有代码可以做到这一点?

对于更多颜色,需要来自这个问题/答案: https ://dba.stackexchange.com/questions/162784/postgresql-translating-user-defined-calculations-into-executable-calculation-in

请注意问题的这一部分:“使用现成的解决方案,可以将解析的结构转换为 SQL。大多数语言都有可以做到这一点的东西,比如 SQL::Abstract。如果没有,你必须创建它。”

编辑:如果重要的话,我们使用的是 PostgreSQL 9.3.5。

4

1 回答 1

0

可能查询太复杂了,但它可以满足您的需要:-)

参数: cmd - 只是解析 op 的结构 - 可能的操作表 - 用于将表名从短格式转换为完整格式的 jsonb 对象(可能您的意思是 'b' -> 'bbg' 和 'p' -> 'pulls' 'bp' -> 'bbg_pulls')。我在 9.6 上运行此查询并使用 jsonb。您可以将其更改为 9.3 的 json

WITH q AS (
     WITH param AS (
        SELECT '[bp2][-1]/[bp5]'::text AS cmd,
               '+-/%*'::text AS op,
               '{"bp": "bbg_pools"}'::jsonb AS tables
     ), precmd AS (
        SELECT btrim(replace(translate(cmd, '[]', ',,'), ',,', ','), ',') AS precmd
        FROM param
     ), split AS (
        SELECT i,
               split_part(precmd, ',', i) AS part
        FROM (
            SELECT generate_series(1, length(precmd) - length(translate(precmd, ',', '')) + 1) AS i,
                   precmd
            FROM precmd
            ) AS a
     ) SELECT *,
              CASE
                  WHEN part ~ ('^[' || op || ']$') THEN
                     ' ) ' || part || ' ( '
                  WHEN tables->>(translate(part, '0123456789', '')) != '' THEN
                     'select val from '::text || (tables->>(translate(part, '0123456789', '0')))  || ' where id = ' || translate(part, translate(part, '0123456789', '0'), '')
                  WHEN part ~ '^[-]?[0-9]*$' THEN
                     ' and val_date = (CURRENT_TIMESTAMP + (''' || part|| ' day'')::interval)::date '
                  ELSE
                     ' ERROR '
                  END AS res
       FROM param, precmd, split
       ORDER BY i
 )
 SELECT 'SELECT (' || string_agg(res, ' ') || ')'
 FROM q;

一些解释(为了更好地理解,您可以尝试使用 SELECT * FROM q 运行查询而不是聚合)。

参数 CTE 只是您的参数。在 precmd 我准备 cmd 拆分部分,并在拆分中执行。

此查询的结果是:

SELECT (select val from bbg_pools where id = 2  and val_date = (CURRENT_TIMESTAMP + ('-1 day')::interval)::date   ) / (  select val from bbg_pools where id = 5)
于 2017-01-31T23:39:20.553 回答