PostgreSQL搜索文本并将其转换为文本数组

6
我有一张名为t1的表。
id  |  names
----|-------------------------
1   |  {jully , alex , sarah}
2   |  {bety , cate , jenifer}
3   |  {adam , pit , joee}
4   |  {piter , mat , andy}

所以,我需要至少有一个以字母"a"开头的名称所在的行。 以下是我需要的结果:
第1行:亚历克斯
第3行:亚当
第4行:安迪
id   |   names
-----|-------------------------
1    |  {jully , alex , sarah}
3    |  {adam , pit , joee}
4    |  {piter , mat , andy}

像它一样的查询
select * from t1 where 'a' like% any t1.name
3个回答

6
select *
from (
    select id, unnest(names) as name
    from t
) s
where name like 'a%';
 id | name 
----+------
  1 | alex
  3 | adam
  4 | andy

将其聚合起来:
select id, array_agg(name)
from (
    select id, unnest(names) as name
    from t
) s
where name like 'a%'
group by id;
 id | array_agg 
----+-----------
  4 | {andy}
  1 | {alex}
  3 | {adam}

unnest函数,将每一行拆分为包含任何项的单独行,这意味着我们有12条记录而不是4条记录,并且带有额外的“名称”字段,这不是解决方案,在我们的数据透视表中,我们有数百万条记录。 - Mehdi Monzavi
感谢Clodoaldo,我尝试了一下,就像我猜测的那样...。因此,我将数组项更改为单独的项,我确信它们是唯一的(例如“andy”=>“an”,“dy”),现在我使用包含操作数的数组....所以通过这种方法,我的问题得到了解决...我的经验;-) - Mehdi Monzavi

2

如果你需要在文本数组中搜索多个值,可以使用以下方法:

最初的回答:

SELECT * FROM t1 WHERE names && ARRAY['alex', 'jully'] ;

2

还有一种使用unnest的解决方案

select * from t1
where exists (
  select * from unnest(t1.names) n
  where n like 'a%')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接