如何为PostgreSQL中的JSON类型列分配预定义代码(1、2、3等)?

如何为PostgreSQL中的JSON类型列分配预定义代码(1、2、3等)?,sql,arrays,postgresql,redash,Sql,Arrays,Postgresql,Redash,我正在提取一个包含2000多行的表,这些行是公园的详细信息。其中一列是JSON类型 我们有大约15个这样的属性,我们也有一份文档,记录了分配给每个属性的预定义代码 提取的表中的每一行都有一组不同的属性,您可以在图像中看到这些属性。现在,我将cast(parks.services作为文本)设置为“details”以获取特定公园的所有属性,或使用以下代码提取其中一个属性: CASE WHEN cast(parks.services AS text) LIKE '%uncovered%'

我正在提取一个包含2000多行的表,这些行是公园的详细信息。其中一列是JSON类型

我们有大约15个这样的属性,我们也有一份文档,记录了分配给每个属性的预定义代码

提取的表中的每一行都有一组不同的属性,您可以在图像中看到这些属性。现在,我将
cast(parks.services作为文本)设置为“details”
以获取特定公园的所有属性,或使用以下代码提取其中一个属性:

CASE
       WHEN cast(parks.services AS text) LIKE '%uncovered%' THEN '2'
       WHEN cast(parks.services AS text) LIKE '%{covered%' THEN '1' END AS "details"
这一次,我需要通过分配代码来提取这些属性。举个例子,让我们说

  • 公园1-{有盖,残疾人通道,电梯}将{1,3,7}
  • 公园2-{无遮盖,始终开放,残疾人通道{2,5,3}
  • 我曾考虑过使用子查询来预先分配代码,但我不能完全理解JSON操作符——事实上,我不知道如何在2000多行上提取它们


    如果有人能在这个话题上指导我,那会很有帮助的。非常感谢

    您真的应该考虑规范化您的表。不要存储数组。应添加映射表以映射公园和属性代码。这使一切变得更容易,更有效


  • 将数组元素提取到每个元素的一个记录中。添加带有序号的
    ,以保存原始订单
  • 在元素上加入你的代码
  • 创建代码数组。为了确保顺序正确,可以使用
    WITH ORDINALITY
    子句创建的
    索引

  • 您应该真正考虑规范化您的表。不要存储数组。应添加映射表以映射公园和属性代码。这使一切变得更容易,更有效


  • 将数组元素提取到每个元素的一个记录中。添加带有序号的
    ,以保存原始订单
  • 在元素上加入你的代码
  • 创建代码数组。为了确保顺序正确,可以使用
    WITH ORDINALITY
    子句创建的
    索引

  • 非常感谢您的反馈。我没有处理表格的丰富经验,所以我弄错了表格。我看到这些值是一个数组,而不是JSON类型。算法(和第一条建议!)保持不变,只是将
    jsonb_数组_元素_文本
    更改为
    unest
    jsonb_agg
    更改为
    array_agg
    。非常感谢您的反馈。我没有处理表格的丰富经验,所以我弄错了表格。我看到这些值是一个数组,而不是JSON类型。算法(和第一条建议!)保持不变,只是将
    jsonb_数组_元素_文本
    更改为
    unest
    ,将
    jsonb_agg
    更改为
    array_agg
    SELECT
        t.name,
        array_agg(c.code ORDER BY elems.index) as codes             -- 3
    FROM mytable t,
        unnest(attributes) WITH ORDINALITY as elems(value, index)   -- 1
    JOIN codes c ON c.name = elems.value                            -- 2
    GROUP BY t.name