我有一个表,其中一列有一个数组 - 但以文本格式存储:
mytable
id ids
-- -------
1 '[3,4]'
2 '[3,5]'
3 '[3]'
etc ...
我想在列中查找值 5 作为数组元素的所有记录ids
。
我试图通过使用“字符串到数组”函数并[
使用该函数删除符号来实现这一点translate
,但找不到方法。
我有一个表,其中一列有一个数组 - 但以文本格式存储:
mytable
id ids
-- -------
1 '[3,4]'
2 '[3,5]'
3 '[3]'
etc ...
我想在列中查找值 5 作为数组元素的所有记录ids
。
我试图通过使用“字符串到数组”函数并[
使用该函数删除符号来实现这一点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);
输出:
| ID | IDS |
--------------
| 2 | [3,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
如果您存储数组的字符串表示形式略有不同,则可以array of integer
直接转换为:
INSERT INTO mytable
VALUES
(1, '{3,4}')
,(2, '{3,5}')
,(3, '{3}');
SELECT id, ids::int[]
FROM mytable;
否则,您必须多做一步:
SELECT (translate(ids, '[]','{}'))::int[]
FROM mytable
我会考虑将列作为数组类型开始。
无论哪种方式,您都可以像这样找到您的行:
SELECT id, ids
FROM (
SELECT id, ids, unnest(ids::int[]) AS elem
FROM mytable
) x
WHERE elem = 5