如何将预先确定的代码(1、2、3 等)分配给 PostgreSQL 中的 JSON 类型的列?

How can I assign pre-determined codes (1,2,3, etc,) to a JSON-type column in PostgreSQL?

我正在提取 table 的 2000 多行公园详细信息。其中一列是 JSON 类型。 Image of the table

我们有大约 15 个这样的属性,我们还有一份分配给每个属性的预定代码的文档。

提取的 table 中的每一行都有一组不同的属性,您可以在图像中看到这些属性。现在,我 cast(parks.services AS text) AS "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 - {覆盖,handicap_access,电梯}为 {1,3,7}
  2. Park 2 - {uncovered, always_open, handicap_access} 为 {2,5,3}

我想过使用子查询来预先分配代码,但我无法理解 JSON 运算符 - 事实上,我不知道如何在 2000 多行中提取它们。

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

您真的应该考虑规范化您的 table。不要存储数组。您应该添加一个映射 table 来映射公园和属性代码。这让一切变得更简单、更高效。


step-by-step demo:db<>fiddle

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
  1. 将数组元素提取到每个元素一条记录中。添加WITH ORDINALITY以保存原始订单。
  2. 在元素上加入您的代码
  3. 创建代码数组。为确保顺序正确,您可以使用 WITH ORDINALITY 子句创建的 index 值。