检查Postgres中的`LIKE`模式是否相交

时间:2013-04-15 10:41:54

标签: regex postgresql

在某些请求中有两个字符串是在LIKE表达式中使用的模式(使用_%占位符)。我想找到这个模式是否相交(有一些匹配它们的字符串)。有没有办法做到这一点?...


“Like pattern”对应于finit或infinit字符串集。此集合中的每个字符串都与给定的模式匹配。我想检查两个给定模式的字符串集的交集是否为空。因此,最好说模式结合。用数学语言:

  

S - 字符串组
   P - 模式集(每个模式都有一个或多个字符串表示)

     

Sᵢ - 匹配pᵢ模式的字符串子集(SᵢᵢS)(而不是i可以是任何索引)。   等式形式:“Sᵢ= {s | s∈S,s匹配pᵢ,pᵢ∈P} “ - meas:”Sᵢ是一组元素,它们是字符串并匹配pᵢ模式“ 。   或另一种表示法:“SᵢᵢS,∀pᵢ∈P∀s∈S(s匹配pᵢ≡s∈Sᵢ)” - 即meas:“Sᵢ是子集字符串和任何字符串是Sᵢ的元素,如果它匹配pᵢ模式“。

     

让我们定义模式的结合:“ p1∧p2 = p3≡S1∩S2 = S 3 ” - 这意味着:“匹配模式 p 1 的字符串组和 p 2 是符合 p 1 模式且符合 p 2 模式“的字符串集的交集。


例如:

  • ab_d%cd - 相交
  • k%nkl___ - 相交

1 个答案:

答案 0 :(得分:1)

  

我想找到这些模式是否相交(有一些匹配它们的字符串)。有没有办法做到这一点?...(...)我想检查两个给定模式的字符串集的交集是否为空。

所以,如果我做对了,给定两个相似的模式,p1和p2,你会对是否存在匹配p1和p2的(尚未确定的)字符串感兴趣。

E.g:

select check_pattern('a%', 'b_'); -- false
select check_pattern('a%', '_b'); -- true ('ab')

您是否首先确定该问题的一般解决方案?

假设存在,普通SQL不是找到解决方案imho的正确工具,因为你无法用“这里是我的(有限)数据集来表达这一点,加入/过滤它们并产生一组基于它”。要在SQL术语中找到解决方案,您需要生成源自您的数据的集合,并且当相关集合无限时,这显然不是一个选项。

你想要将问题分解成更小的部分,并使用C,Perl,Lisp等程序语言,无论你想要什么。

一个可能的解决方案可能是:

  • 如果p1和p2的两端或两端都是开放的,那么答案很简单:匹配%foo%的字符串将与匹配%bar%的字符串相交,就像字符串匹配{{ 1}}将匹配与foo%匹配的字符串。

  • 如果p1产生有限集(即它不包含%bar),您可以想象使用%generate_series()循环迭代p1的整个潜在匹配集,并在每个字符串上尝试p2。这是丑陋和低效的,但它最终会起作用。

  • 如果p1和p2都被锚定(例如for/while/whateverabc%def%%abc),或者合理地锚定(例如%def_abc%)通过考虑锚定部分并按照先前的情况进行处理,解决方案也是微不足道的。

  • 如果有的话,我会留给你列举并解决剩余的案件......

我认为关键是要确定模式的锚定部分,这些部分会产生一组有限的字符串,并坚持检查它们匹配的(有限)字符串集是否会相交。