【问题标题】:Oracle regex to list unique characters difference between two stringsOracle正则表达式列出两个字符串之间的唯一字符差异
【发布时间】:2010-11-27 15:28:38
【问题描述】:

在 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 中的正则表达式,因此我们将不胜感激。

这是我(不工作)的想法:

select regexp_replace("éaé", '[a-z][A-Z]', '' ) from dual;

会将“é”作为要清理的字符。

【问题讨论】:

    标签: sql regex oracle oracle10g


    【解决方案1】:

    也许这样的事情可能会让你朝着正确的方向前进:

    SQL> select regexp_replace('éaéABcdEF', '([a-zA-Z])', '' ) problems from dual;
    
    PROBLEMS
    --------
    éé
    

    它会为您提供要识别的字符的每次出现,但也许这不是问题,或者您可以对其进行改进...

    【讨论】:

      【解决方案2】:

      我认为您唯一的错误是在问题的第一个参数中使用了双引号。通常双引号仅用于列/表名称。

      DCookie 添加的括号使正则表达式匹配多次。根据名称字段中的内容,您可能需要在替换子句中添加更多字符,包括标点符号(使用两个单引号来匹配引号)。这是你的开始:

      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 ,.;''"])\-?','');
      

      【讨论】:

        【解决方案3】:
        SELECT LISTAGG( letter, '' ) WITHIN GROUP(ORDER BY letter) 
               FROM ( SELECT DISTINCT substr( 'aaaaabcde', level, 1 ) letter 
                             FROM dual CONNECT BY level <= length('aaaaabcde') )
        

        【讨论】:

        • SELECT LISTAGG( letter, '' ) WITHIN GROUP(ORDER BY letter) FROM ( SELECT DISTINCT substr( 'aaaaabcde', level, 1 ) letter FROM dual CONNECT BY level
        猜你喜欢
        • 1970-01-01
        • 2014-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多