如何检查数组中是否有字段不包含子字符串?
$ select * from blogs;
id | comments
-------+---------------
1 | {str1,str2,str3}
2 | {_substr_,str2,str3}
字符串
我所期待的是这样的:
> select * from mytable where ANY(comments) not like '%substr%';
id | comments
-------+---------------
1 | {str1,str2,str3}
型
如果我使用unnest
,我将得到解压缩的数组与每个记录(不期望)连接,如下所示:https://www.db-fiddle.com/f/9997TuKMMzFUUuyr5VJX7a/0
> select * from (select id,unnest(comments) as cmts from t1) tmp where cmts not like '%substr%'
id | cmts
-------+------
1 | str1
1 | str2
1 | str3
2 | str2
2 | str3
型
如果我使用array_to_string(array, delimiter)
和not like
,我可以得到我想要的,如下所示
> select * from (select id,array_to_string(comments, ',') as cmts from blogs) tmp where cmts not like '%substr%';
id | cmts
-------+----------------
1 | str1,str2,str3
型
但是,有一个限制:*substr*
不能包含delimiter
:
# select * from (select id,array_to_string(comments, ',') as cmts from blogs) tmp where cmts not like '%str1,str2%';
id | cmts
-------+--------------------
2 | _substr_,str2,str3
型
如果comments
的任何字段不包含指定的子字符串,是否有更好的方法来过滤整行?
2条答案
按热度按时间0mkxixxg1#
如果你的表中有一个唯一的id,你可以这样做(result here)
字符串
50few1ms2#
你可以尝试使用
unnest
函数。字符串
如果你不想解压缩数组,另一种方法是尝试将
ARRAY_TO_STRING
函数与LIKE
一起使用。型