【问题标题】:Check if the array of text column contains string containing phrase检查文本列的数组是否包含包含短语的字符串
【发布时间】:2021-06-13 07:07:20
【问题描述】:

我有一个表customers,其结构如下:

id: int
products: text[]

我想创建 SQL 查询来检查是否存在名称包含短语“a”但不包含短语“b”的产品,所以基本上: 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%';

理论上我可以这样做:

products::TEXT ILIKE '%a%' AND products::TEXT NOT ILIKE '%b%'

但这是一个丑陋的 hack,并不总是有效

【问题讨论】:

  • 您显示的第一个查询有什么问题?
  • 您可能需要考虑一个正确标准化的模型。不要在应该是一对多关系的事情上滥用数组
  • @a_horse_with_no_name 不幸的是我无法改变它,我必须在这里处理文本数组。它已经是“标准化”数据。我不对这个结构负全部责任,而且我个人只会将产品 ID 存储在那里并按产品 ID 进行查找,但这不是那里发生的事情 :)
  • @jjanes 它不起作用 :) 每当第一个 ILIKE 检查返回 true 它已经返回该行,当第二个 ILIKE 检查返回 @ 时它甚至不会排除行987654332@。所以基本上它不会连续进行适当的条件检查。相反,它会检查未嵌套结果集的每个子行。

标签: sql postgresql unnest lateral-join


【解决方案1】:

我会推荐:

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%'
      ) ;

【讨论】:

  • 谢谢! :) 它有效 :) 它不是超级快,因为它必须为每种情况做 unnest 产品,但它现在已经足够好了。我希望有更多的选项来处理 MongoDB 中的嵌套值。在 MongoDB 中,这将是超级快速且容易做到的。也许编写自定义函数会更快,但我从未尝试过:)。不管怎样,谢谢你的帮助!
  • 嗯,有趣的第二个解决方案。是的,确实,它看起来更复杂,但我会试试看:)。查询是根据条件动态生成的,因此使用这种方法可能并不容易,因为我实际上使用的是SELECT FILTER WHERE(and here I have the actual condition)。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 2022-06-30
  • 1970-01-01
  • 2021-06-10
  • 2021-12-14
  • 2021-03-04
  • 2013-11-20
相关资源
最近更新 更多