如何解决检查文本列的数组是否包含包含短语的字符串
我有一个表 null
,其结构如下:
customers
我想创建 SQL 查询来检查是否存在名称包含短语“a”但不包含短语“b”的产品,因此基本上:
id: int
products: text[]
如果我想检查元素是否存在,那么它就像使用 product ILIKE "%a%" AND product NOT ILIKE "%b%"
运算符一样简单,但在这里我尝试了 @>
和许多不同的方法,但似乎没有任何效果。
我只想根据此条件包含或不包含给定的客户行。你能帮忙吗?
我尝试了以下方法:
UNNEST
或
SELECT
*
FROM
customers,UNNEST(products) AS product
WHERE
product ILIKE '%a%' AND product NOT ILIKE '%b%';
理论上我可以这样做:
SELECT
*
FROM
customers
LEFT JOIN LATERAL (
SELECT * FROM UNNEST(products) AS element
) AS products2 ON TRUE
WHERE
element ILIKE '%a%' AND element NOT ILIKE '%b%';
但这是一个丑陋的黑客,并不总是有效
解决方法
我会推荐:
select c.*
from customers c
where exists (select 1
from unnest(c.products) p
where p like '%a%'
) and
not exists (select 1
from unnest(c.products) p
where p like '%b%'
);
您可以用一个 unnest 来做到这一点。只是看起来更复杂:
select c.*
from customers c
where (select countif(p like '%a%') = count(*) and
countif(p like '%b%') = 0
from unnest(c.products) p
where p like '%a%' or p like '%b%'
) ;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。