tmo*_*mow 7 regular-expression db2
我在stackoverflow上发布了相同的内容(请告诉我是否必须删除一个)。
我正在处理 DB2 数据库,据我所知,不支持正则表达式(没有其他库)。
因此,我无法实现类似于本文“将正则表达式匹配的强大功能引入 SQL ”中所解释的内容
你知道我是否可以用 SQL 语句“模拟”这样的正则表达式吗?
^a[aofdmep]{1}[az]{1}[a-z0-9]{4}[sidbfkfpo]{1}
编辑
在上述假设中,我发现WHERE Like 谓词对我来说是可以接受的:
WHERE USER_NAME 不喜欢“a___”
但这是不安全的,并且不涵盖我没有可以匹配的固定字符的其他情况。
mus*_*cio 12
既然这个老问题已经被挖出来了,我会提到你可以使用 DB2 中内置的 XQuery 支持来进行正则表达式匹配,类似于
select whatever
from users
where
xmlcast(
xmlquery('fn:matches($USER_NAME,"^a[aofdmep][a-z][a-z0-9]{4}[sidbfkfpo]")')
as integer) = 1
Run Code Online (Sandbox Code Playgroud)
XMLQUERY
上matches
面对列调用 XQuery函数USER_NAME
。结果是一个 XML boolean
,因此XMLCAST
用于将其转换为 SQL 数据类型。
Joe*_*Joe 11
首先,{1}
s 是多余的,所以它真的只是:
^[aofdmep][a-z][a-z0-9]{4}a[sidbfkfpo]
Run Code Online (Sandbox Code Playgroud)
这实际上是一个非常简单的模式……它只是查看字符串的前 8 个字符是什么,并且它始终是一个固定长度的字符串,因此您可以构建一个包含所有排列的表,然后执行以下操作:
WHERE SUBSTR(string_to_match, 1, 8) IN (
SELECT valid_prefixes FROM table_of_things_to_match
)
Run Code Online (Sandbox Code Playgroud)
不幸的是,它是 7*26*36^4*9 ... 27.5 亿种可能的组合,但是,仍然是固定的字符串,所以你可以这样做:
WHERE SUBSTR(string_to_match, 1, 1) IN ('a','o','f','d','m','e','p')
AND SUBSTR(string_to_match, 2, 1) IN ('a','b','c','d' ... 'z')
AND SUBSTR(string_to_match, 3, 1) IN ('a','b','c','d' ... 'z','0','1' ... '9')
AND SUBSTR(string_to_match, 4, 1) IN ('a','b','c','d' ... 'z','0','1' ... '9')
AND SUBSTR(string_to_match, 5, 1) IN ('a','b','c','d' ... 'z','0','1' ... '9')
AND SUBSTR(string_to_match, 6, 1) IN ('a','b','c','d' ... 'z','0','1' ... '9')
AND SUBSTR(string_to_match, 7, 1) = 'a'
AND SUBSTR(string_to_match, 8, 1) IN ('s','i','d','b','f','k','p','o')
Run Code Online (Sandbox Code Playgroud)
(...
当然是填位)
哎呀,f
在最后一个字符类中有两个s,所以只有 24.5 亿个排列。
我不会假装它会很快......它可能不会,但它会让你得到你正在寻找的模式。如果您经常这样做,我可能会构建一个字符表,以便您可以轻松选择字母/数字或字母数字。
SELECT * FROM
(SELECT 'afr923zs' MyString FROM SYSIBM.SYSDUMMY1)
WHERE substr(MyString,1,1) = 'a'
AND substr(MyString,2,1) IN ('a','o','f','d','m','e','p')
AND substr(MyString,3,1) BETWEEN 'a' AND 'z'
AND (substr(MyString,4,1) BETWEEN 'a' AND 'z'
OR substr(MyString,4,1) BETWEEN '0' AND '9')
AND (substr(MyString,5,1) BETWEEN 'a' AND 'z'
OR substr(MyString,5,1) BETWEEN '0' AND '9')
AND (substr(MyString,6,1) BETWEEN 'a' AND 'z'
OR substr(MyString,6,1) BETWEEN '0' AND '9')
AND (substr(MyString,7,1) BETWEEN 'a' AND 'z'
OR substr(MyString,7,1) BETWEEN '0' AND '9')
AND substr(MyString,8,1) IN ('s','i','d','b','f','k','p','o');
Run Code Online (Sandbox Code Playgroud)