在Oracle 10g中,我想创建一个正则表达式来列出那些字符 两个字符串之间有所不同。
原因如下: 我有一个表,其中包含有时不包含法语的Unicode字符的字段。
我能够列出包含这些非标准字符的行,以便创造未来 使用此查询进行清理:
SELECT DataID, Name, CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC')
FROM table
WHERE NAME <> CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC' )
WE8ISO8859P1 - 西欧(我接受)
和WE8DEC - Digital Equipment Corporation的8位字符集(我知道应用程序支持)
我想通过Oracle正则表达式,我可以提取所有这些非标准字符的列表。但我不熟悉Oracle中的regexp,所以任何帮助都会受到赞赏。
这是我的(不工作)想法:
select regexp_replace("éaé", '[a-z][A-Z]', '' ) from dual;
会将“é”作为清理角色。
答案 0 :(得分:3)
也许这样的事情可能会让你朝着正确的方向前进:
SQL> select regexp_replace('éaéABcdEF', '([a-zA-Z])', '' ) problems from dual;
PROBLEMS
--------
éé
它会为您提供您想要识别的每个字符,但也许这不是问题,或者您可以对其进行优化......
答案 1 :(得分:0)
我认为你唯一的错误就是在问题的第一个参数中使用双引号。通常,双引号仅用于列/表名称。
DCookie添加的parantheses使正则表达式匹配多次。根据名称字段中的内容,您可能需要向replace子句添加更多字符,包括puncuation(使用两个单引号来匹配引号)。这是一个开始:
SELECT regexp_replace(name, '([a-zA-Z ,.;''"])\-?','') problem_characters , count(*)
FROM table
WHERE NAME <> CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC' )
group by regexp_replace(name, '([a-zA-Z ,.;''"])\-?','');
答案 2 :(得分:-1)
SELECT LISTAGG( letter, '' ) WITHIN GROUP(ORDER BY letter)
FROM ( SELECT DISTINCT substr( 'aaaaabcde', level, 1 ) letter
FROM dual CONNECT BY level <= length('aaaaabcde') )