小编典典

PostgreSQL查询文本数组值

sql

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

mytable

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

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

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


阅读 224

收藏
2021-04-28

共1个答案

小编典典

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

2021-04-28