我有一张表,其中一列有一个数组-但以文本格式存储:
mytable id ids -- ------- 1 '[3,4]' 2 '[3,5]' 3 '[3]' etc ...
我想在列中查找所有值为5的记录作为数组元素ids。
ids
我试图通过使用“字符串数组”功能并[使用该translate功能删除符号来实现这一点,但是找不到办法。
[
translate
您可以这样做:http : //www.sqlfiddle.com/#!1/5c148/12
select * from tbl where translate(ids, '[]','{}')::int[] && array[5];
输出:
| ID | IDS | -------------- | 2 | [3,5] |
您也可以使用bool_or:http ://www.sqlfiddle.com/#!1 / 5c148 /11
with a as ( select id, unnest(translate(ids, '[]','{}')::int[]) as elem from tbl ) select id from a group by id having bool_or(elem = 5);
要查看原始元素,请执行以下操作:
with a as ( select id, unnest(translate(ids, '[]','{}')::int[]) as elem from tbl ) select id, '[' || array_to_string(array_agg(elem), ',') || ']' as ids from a group by id having bool_or(elem = 5);
Postgresql DDL是原子的,如果在您的项目中还不算晚,只需将字符串类型的数组构造为实际数组即可:http ://www.sqlfiddle.com/#!1/6e18c /2
alter table tbl add column id_array int[]; update tbl set id_array = translate(ids,'[]','{}')::int[]; alter table tbl drop column ids;
询问:
select * from tbl where id_array && array[5]
| ID | ID_ARRAY | ----------------- | 2 | 3,5 |
您还可以使用包含运算符:http : //www.sqlfiddle.com/#!1/6e18c/6
select * from tbl where id_array @> array[5];
我更喜欢&&语法,但是它直接表示交集。它反映出您正在检测两个集合之间是否存在交集(数组是一个集合)
&&
http://www.postgresql.org/docs/8.2/static/functions- array.html