Oracle正则表达式列出两个字符串之间的唯一字符差异

时间:2009-09-11 20:48:29

标签: sql regex oracle oracle10g

在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;

会将“é”作为清理角色。

3 个答案:

答案 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') )