4

我有一个表,其中一列有一个数组 - 但以文本格式存储:

mytable

id  ids
--  -------
1   '[3,4]'
2   '[3,5]'
3   '[3]'
etc ...

我想在列中查找值 5 作为数组元素的所有记录ids

我试图通过使用“字符串到数组”函数并[使用该函数删除符号来实现这一点translate,但找不到方法。

4

2 回答 2

4

你可以这样做: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

于 2012-09-15T02:55:57.653 回答
3

如果您存储数组的字符串表示形式略有不同,则可以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
于 2012-09-14T23:48:27.027 回答