我在stackoverflow上发布了相同的内容(请告诉我是否必须删除一个)。
我正在开发一个 DB2 数据库,据我所知,不支持 regexp(没有其他库)。
所以我无法实现类似于本文“将正则表达式匹配的力量带入 SQL ”中所解释的内容
你知道我是否可以用 SQL 语句“模拟”这样的正则表达式吗?
^a[aofdmep]{1}[az]{1}[a-z0-9]{4}[sidbfkfpo]{1}
编辑
在上述假设中,我发现我的情况可以接受WHERE Like 谓词:
WHERE USER_NAME NOT LIKE 'a_______'
但这是不安全的,并且不包括我没有可以匹配的固定字符的其他情况。
既然这个老问题已经被挖掘出来了,我会提到你可以使用 DB2 中内置的 XQuery 支持来进行正则表达式匹配,类似于
XMLQUERY
matches
上面针对该列调用 XQuery函数USER_NAME
。结果是 XMLboolean
,因此XMLCAST
用于将其转换为 SQL 数据类型。首先,
{1}
s 是多余的,所以它实际上只是:这实际上是一个非常简单的模式......它只是查看字符串的前 8 个字符是什么,并且它始终是一个固定长度的字符串,因此您可以构建一个包含所有排列的表,然后执行以下操作:
不幸的是,它是 7*26*36^4*9 ... 27.5 亿个可能的组合,但仍然是固定字符串,所以你可以这样做:
(当然是填写
...
位)哎呀,
f
最后一个字符类中有两个 s,所以只有 24.5 亿个排列。我不会假装它会很快......它可能不会很快,但它会给你你正在寻找的模式。如果你经常这样做,我可能会建立一个字符表,这样你就有一种简单的方法来选择字母/数字或字母数字。
基于 Leigh Riffel 和 Joe 的回答,当您有很长的单个字符列表或有多个字符范围时,您可能会考虑使用 LIKE。
由于您多次使用相同的字符列表,您还可以考虑使用 CROSS JOINed 常量列。
您的示例不需要,但 CROSS JOINed “表”可以定义多个命名字符类列。
REGEXP_LIKE 现在在 DB2 for iSeries 中可用 - 请参阅: http ://www.itjungle.com/fhg/fhg051915-story01.html
在 DB2 for z/OS 中,SQL 将包括 PASSING,如下所示