sql - 查询postgres中的文本数组

标签 sql arrays postgresql performance

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

例如。

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

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

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

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

最佳答案

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

更多信息:

关于sql - 查询postgres中的文本数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54488627/

相关文章:

c++ - 作为函数参数的大小数组的目的是 C 和 C++?

arrays - CakePHP函数将点分数组转换为多维

java - 给定一个像滚动缓冲区一样按顺序实时填充的循环数组,求结果函数的导数

postgresql - 转储表的子集

php - Laravel 上的外键约束形成不正确

sql - 显式与隐式 SQL 连接

sql - 在 sqlplus 中转储函数或过程的主体

php - 带有 "WHERE"问题的小型 php fetch 查询

python - Django 应用程序 : unit tests fails because of django. db.utils.IntegrityError

function - 使用动态 sql 返回多个结果(postgresql 8.2)