【问题标题】:Querying array of text in postgres在 postgres 中查询文本数组
【发布时间】:2019-02-01 23:55:59
【问题描述】:

我有一个要存储在 Postgres 中的数组类型。我的主要用例之一是查看是否有任何记录具有包含字符串的数组。

例如。

| A | ["NY", "Paris", "Milan"] |
| B | ["Paris", "NY"]          |
| C | []                       |
| D | ["Milan"]                |

数组中是否存在带有Paris 的行?数组中有哪些行有Milan?等等。

关于如何存储该列,我有 2 个选项。我可以将其设为 text[] 类型或将其转换为 json 为 {"cities": ["NY", "Paris", "Milan"]} 然后存储为 JSONB 字段

但是,我不确定什么可以让我对我的用例进行最快的查询。有没有明显更好的方法来做到这一点?我是否通过选择一个而不是另一个来束缚自己?如果我选择其中一个,那么如何查询数据库?

【问题讨论】:

    标签: sql arrays postgresql performance


    【解决方案1】:

    我注意到最好查询 JSONB,如果它是一个简单的键值存储。 例如,您想在不确定列(键)是什么的行上存储任意信息。 info = {"a":"apple", "b":"ball"}

    对于像您这样的用例,最好使用简单的表来设计数据库,这样您就可以利用 JOINS 和索引来发挥自己的优势。

    您可以像这样重组表格:

    位置

    id | name
    ----------
    1  | Paris
    2  | NY
    3  | Milan 
    

    其他表(位置表上有外键)

    user | location_id
    --------------------
    A    | 1
    A    | 3
    B    | 2
    

    使用这组表,可以很容易地使用 JOINS 查询所有位置为 paris 的用户。

    【讨论】:

      【解决方案2】:

      由于您似乎存储的是简单的值列表,我建议使用 datataype Array 而不是 JSON,它更适合更复杂的情况(嵌套数据结构、关联数组等)。

      要检查数组中任意位置的元素值,可以使用数组函数ANY()

      这是一个查询,它将返回存储在列cities 中的数组包含'Paris' 的所有记录:

      SELECT t.* FROM mytable t WHERE 'Paris' = ANY(t.cities);
      

      产量:

      id  cities
      ---------------------------
      A   ["NY","Paris","Milan"]
      B   ["Paris","NY"]
      

      Demo on DB Fiddle

      更多信息:

      【讨论】:

        猜你喜欢
        • 2013-09-20
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2015-07-04
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        相关资源
        最近更新 更多