0

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

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

提取表中的每一行都有一组不同的属性,您可以在图像中看到这些属性。现在,我必须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 - {covered, handicap_access, lift} 为 {1,3,7}
  2. 公园 2 - {uncovered, always_open, handicap_access} 为 {2,5,3}

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

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

4

1 回答 1

2

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


分步演示: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. 创建代码数组。为确保顺序正确,您可以使用子句index创建的值。WITH ORDINALITY
于 2021-02-22T13:13:36.867 回答