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

Tim*_*kov 5 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%n和kl___- 相交

Den*_*rdy 1

我想找出这个模式是否相交(有一些字符串与它们都匹配)。有什么方法可以做到这一点吗?... (...) 我想检查两个给定模式的字符串集的交集是否不为空。

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

例如:

select check_pattern('a%', 'b_'); -- false
select check_pattern('a%', '_b'); -- true ('ab')
Run Code Online (Sandbox Code Playgroud)

您是否确定首先有一个通用的解决方案来解决该问题?

假设存在这种情况,恕我直言,普通 SQL 并不是找到解决方案的正确工具,因为您无法轻松地用“这是我的(有限)数据集,连接/过滤它们并基于它生成一组数据”来表达这一点。要找到 SQL 术语的解决方案,您需要生成源自数据的集合,当所讨论的集合是无限时,这显然不是一个选项。

我认为您希望将问题分解为更小的部分,并使用过程语言,例如 C、Perl、Lisp,无论您喜欢什么。

一种潜在的解决方案可能是这样的:

  • 如果 p1 和 p2 在两端或不同端都开路,那么答案显然是肯定的:匹配的字符串%foo%将与匹配的字符串相交%bar%,就像匹配的字符串foo%将与匹配的字符串相交一样%bar。

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

  • 如果 p1 和 p2 都被锚定(例如abc%和def%或%abc和%def),或者合理地锚定(例如_abc%和abcd%),那么通过考虑锚定部分并按照前面的情况继续进行,解决方案也足够简单。

  • 剩下的情况就交给你来列举并解决吧……

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