我有一个oracle数据库,并通过regex进行筛选,以查找名称在特定范围内以较湿润开头的条目。例如,要查找所有以A、B或C开头的名称,我只使用:
.. WHERE REGEXP_LIKE (last_name, '^[A-C]');
但我正在寻找一个解决方案来过滤类似的东西。查找所有以"Ab"-"Ch"开头的名称。有人知道怎么做吗?
谢谢。Phill
编辑:我忘了说我来自德国,我也需要支持特殊的角色。Oracle正则表达式具有使用字母的所有变体的特殊功能。例如,[=A=]表示A的所有变体,如A、ä、É等等
巧克力朝的解决方案给了我一个很好的提示来解决我的问题。例如,如果我想找到所有以"Ne"开头的名称,直到所有以"Ot"开头(包括特殊字符(的名称,我可以使用
WHERE REGEXP_LIKE (last_name, '^(([=A=][[=N=]-[=Z=]])|([=B=][[=A=]-[=E=]]))');
第2版:我发现的另一个不错的解决方案是将所有名称字符串规范化为不再包含特殊字符的值。对我来说,结果是一样的,但肯定更快:
LOWER(convert(last_name, 'US7ASCII' )) >= LOWER('An') AND SUBSTR(LOWER(convert(last_name, 'US7ASCII' )),1,LENGTH('Be')) <= LOWER('Be')
是否需要特定的大小写字符、连字符、撇号(即O'Brien
(、扩展字符集?
您可以使用:
WHERE SUBSTR( last_name, 1, 2 ) BETWEEN 'Ab' AND 'Ch'
或者,独立于口音:
WHERE SUBSTR( UTL_RAW.CAST_TO_VARCHAR2((NLSSORT( last_name, 'nls_sort=binary_ai'))), 1, 2 ) BETWEEN 'ab' AND 'ch'
或者,如果您只期望大写字母后接小写字符,您也可以使用此正则表达式(但它可能不如使用SUBSTR
有效(:
WHERE REGEXP_LIKE( last_name, '^(A[b-z]|B|C[a-h])' )
我不熟悉oracle,但你可以试试这个regex:
^((A[b-z])|(B[a-z])|(C[a-h]))
它只是检查以开头的字符串
- A后接b-z OR
- B后跟a-z或
- C后接a-h
不带regexp 的解决方案
where last_name >= 'Ab' AND where last_name <= 'Ch'
不确定我是否完全理解,但尝试一下:
WHERE REGEXP_LIKE (last_name, '^[A-C][b-h]');
或
WHERE REGEXP_LIKE (last_name, '^(A[b-z]|B[a-z]|C[a-h])');
如果CCD_ 3需要匹配。