Pergunta

No Oracle 10g, eu gostaria de criar uma expressão regular para listar os personagens que são diferente entre duas strings.

Aqui está a razão: Eu tenho uma tabela com um campo que contém, por vezes, os caracteres Unicode que não estão na língua francesa.

Eu sou capaz de listar as linhas que contêm estes caracteres nonstandards para fazer um futuro limpeza com esta consulta:

SELECT DataID, Name, CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC')  
  FROM table
  WHERE NAME <> CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC' )

onde WE8ISO8859P1 - West Europeia (que aceito)

e WE8DEC - conjuntos de caracteres de 8 bits da Digital Equipment Corporation (que eu sei que o suporte a aplicativos)

Eu imagino que, com uma expressão regular a Oracle eu seria capaz de extrair a lista de todos esses personagens nonstandards. Mas eu não estou familiarizado com regexp no Oracle por isso qualquer ajuda seria apreciada.

Aqui está o meu (não funciona) ideia:

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

daria "é" como um personagem de limpeza.

Foi útil?

Solução

Talvez algo como isso pode te indo na direção certa:

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

PROBLEMS
--------
éé

Ela dá-lhe cada ocorrência dos caracteres que você deseja identificar, mas talvez isso não é um problema ou você pode refiná-lo ...

Outras dicas

Eu acho que seu único erro foi o uso de aspas duplas para o primeiro parâmetro na sua pergunta. Normalmente aspas duplas são utilizados apenas para nomes de coluna / table.

Os parantheses que DCookie acrescentou tornar o jogo regex várias vezes. Dependendo do que está no campo de nome, você pode precisar adicionar mais personagens para a cláusula de substituir, incluindo puncuation (use duas aspas simples para coincidir com uma citação). Aqui é um começo para você:

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 ,.;''"])\-?','');
SELECT LISTAGG( letter, '' ) WITHIN GROUP(ORDER BY letter) 
       FROM ( SELECT DISTINCT substr( 'aaaaabcde', level, 1 ) letter 
                     FROM dual CONNECT BY level <= length('aaaaabcde') )
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top