在PostgreSQL中执行动态查询字符串

在PostgreSQL中执行动态查询字符串,postgresql,Postgresql,我有一个包含JSON值的表,我使用下面的查询对其进行了操作,如果我单独指定每一列,那么查询将正常工作,而不是我希望它是动态的,因此如果我向JSON字符串中添加了任何列,那么它将自动获取相应的列 那么,如何在PostgreSQL中执行下面生成的动态查询呢 已尝试使用EXECUTE,但在SELECT附近显示语法错误 任何建议都会大有帮助 -- THE CTE will get all the created columns in the JSON string,So if someone add a

我有一个包含JSON值的表,我使用下面的查询对其进行了操作,如果我单独指定每一列,那么查询将正常工作,而不是我希望它是动态的,因此如果我向JSON字符串中添加了任何列,那么它将自动获取相应的列

那么,如何在PostgreSQL中执行下面生成的动态查询呢

已尝试使用EXECUTE,但在SELECT附近显示语法错误

任何建议都会大有帮助

-- THE CTE will get all the created columns in the JSON string,So if someone add a new column it will take that new column.

WITH CTE AS
(
    SELECT DISTINCT
        elems ->> 'name' AS column_name
    , 'MAX(value) FILTER (WHERE column_name = ''' || CAST(elems ->> 'name' as TEXT) || ''') as '|| CAST(elems ->> 'name' as TEXT) 
      as selected_customfields

FROM
        dl_get_response.gr_contacts,
        json_array_elements( "customFieldValues"::json) elems
)
-- below is the actual query i want to execute,The result of the custom_query CTE need to be executed 
,custom_query as 
(
    SELECT '''SELECT ' || string_agg(DISTINCT selected_customfields::character varying, ',') || ',email '
|| 'FROM (
    SELECT
        elems ->> ''name'' AS column_name,
        elems -> ''value'' ->> 0 AS value,
         "customFieldValues",email
    FROM
        dl_get_response.gr_contacts,
        json_array_elements( "customFieldValues"::json) elems
) s
GROUP BY  "customFieldValues",s.email''' as q
FROM CTE
)
如何执行从上述CTE生成的字符串?

下面是“customFieldValues”列中的示例值(这是文本数据类型,下面的示例将其转换为JSON类型,并从中获取每个名称及其值

[
{"value": ["product_101"], "values": ["product_101"], "type": "text", "valueType": "string", "name": "cat_1", "customFieldId": "ef", "fieldType": "text"}
,{"value": ["AXE"], "values": ["AXE"], "type": "text", "valueType": "string", "name": "cat_2", "customFieldId": "e3", "fieldType": "text"}
,{"value": ["General"], "values": ["General"], "type": "text", "valueType": "string", "name": "customer_group", "customFieldId": "ee", "fieldType": "text"}
]
上述的样本输出将为

Cat_1(Column 1)          cat_2(column 2)     customer_group(column 3)
product_101              AXE                 General
因此,基本上,在每个集合中,我需要“name”数据作为列名,“value”作为列值。挑战在于,如果我对查询进行硬编码,它的工作方式将完全如下所示。但我需要指定每个列名“MAX(value)FILTER(其中column_name='cat_1')作为cat_1_all”这样,但是customFieldValues“列可以更改,因此每当添加一个新列时,我都需要更改此脚本。因此,我考虑按上述代码所示动态获取列名,这样无论添加了什么列,它都会自动获取新列及其值并形成表结构

最上面的代码就是我想到的,所以我创建了一个字符串变量作为整个查询,我需要执行它,这就是我在最上面的代码中要做的

希望我已经说清楚了,如果你能在这方面提供指导,将会非常有帮助

SELECT email,
MAX(value) FILTER (WHERE column_name = 'cat_1') AS cat_1_all,
MAX(value) FILTER (WHERE column_name = 'cat_2') AS cat_2_all,
MAX(value) FILTER (WHERE column_name = 'customer_group') AS customer_group
FROM (
    SELECT
        elems ->> 'name' AS column_name,
        elems -> 'value' ->> 0 AS value,
         "customFieldValues",email
    FROM
        dl_get_response.gr_contacts,
        json_array_elements( "customFieldValues"::json) elems
) s
GROUP BY  "customFieldValues",s.email

引用一匹没有名字的“马”的评论

可能使用查询\u到\u xml“” 或者编写自己的查询到jsonb–“解决了这个问题。我使用了查询到xml的方法,结果很好


非常感谢您的回答。

该查询非常混乱和复杂,没有表定义和一些测试数据,我无法完全理解您想要的内容。也许您可以想出一个简单的示例来说明问题。@LaurenzAlbe我已经修改了我原来的问题,并添加了更多信息。您能否检查并告诉我是否可以在这方面获得合适的解决方案?可能使用
query\u to\u xml
(正如我所做的那样)或者写你自己的@a_horse_(没有名字),实际上我想执行最上面的查询,这是一个动态创建的查询,当执行该查询时,它将给出表结构中的数据,我需要将其插入到目标表中。@Laurenzalbean关于这方面的任何建议,任何指导都将非常有用!