查询postgres中的文本数组

时间:2019-02-01 23:56:00

标签: sql arrays postgresql performance

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

例如

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

您可以像这样重组表:

位置

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

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

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

使用这些表集,可以轻松地使用JOINS查询所有位置为 paris 的用户。

答案 1 :(得分:0)

由于您似乎要存储简单的值列表,所以我建议使用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

有关更多信息: