【问题标题】:postgres && - Array Overlap operator with wildcardpostgres && - 带有通配符的数组重叠运算符
【发布时间】:2021-05-16 03:29:08
【问题描述】:

在 postgres 中

select array['some', 'word'] && array ['some','xxx']   -- return true
select array['some', 'word'] && array ['','word']   -- return true

我想知道如何将 % 通配符与 && 运算符结合使用。

select array['some%', 'word'] && array ['','some']  -- I was thinking this will return true but it doesn't.

我想检查一个文本数组是否至少包含另一个文本数组的一个元素。第一个文本数组可以包含通配符。最好的方法是什么?

【问题讨论】:

  • 我的建议是在这种情况下不要使用数组或 JSON。
  • 我正在使用一个包含文本数组的 jsonb 字段。 @Laurenz Albe,在这种情况下,数组或 json 有什么问题?
  • 问题是你最终会得到一个复杂的查询,它不会很好地执行并且无法被索引。如果您将数据存储在常规列中,那就更好了。

标签: sql arrays postgresql wildcard


【解决方案1】:

您可以尝试unnest 解析两个数组的每个元素并使用LIKEILIKE 进行比较:

SELECT EXISTS(
  SELECT  
  FROM unnest(array['some%', 'word']) i (txt),
       unnest(array ['','some']) j (txt)
  WHERE j.txt LIKE i.txt) AS overlaps;

 overlaps 
----------
 t
(1 row)

如果要将%应用于所有数组元素,只需将其直接放在LIKEILIKE运算符的WHERE子句中即可:

SELECT EXISTS(
  SELECT  
  FROM unnest(array['some', 'word']) i (txt),
       unnest(array ['','XXsomeXX']) j (txt)
  WHERE j.txt LIKE '%'||i.txt||'%') AS overlaps;

 overlaps 
----------
 t
(1 row)

演示:db<>fiddle

【讨论】:

  • 假设我的数组之一是 jsonb 字段属性,我可以使用什么样的索引来获取查询计划器进行索引扫描? SELECT EXISTS( SELECT FROM unnest(ARRAY( select * from jsonb_array_elements_text(input->'listAddressOrigRef'))::text[]) i (txt), unnest(array ['','some']) j (txt) WHERE j.txt LIKE i.txt) AS overlaps;
  • @soung 您需要告诉 postgres 在哪里获取要索引的值,请参阅此答案:dba.stackexchange.com/a/167965/144842
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 2012-10-09
  • 2019-09-05
  • 2022-01-17
  • 1970-01-01
  • 2021-11-27
相关资源
最近更新 更多