Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/12/2010, 12h41   #1
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 64
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France

Informations forums :
Inscription : mai 2006
Messages : 64
Points : 25
Points : 25
Par défaut Remplacement de tous les caractères accentués par leur équivalent non accentué

Bonjour à tous,

Pour le projet sur lequel je travaille, nous avons une table DWG qui contient entre autres les colonnes DWG_NUMBER et DWG_NUMBER_SIMPLIFIED.
Le n° simplifié est généré programmatiquement en Java. Les règles sont:
1. remplacement de tous les caractères accentués par leur équivalent non accentué (é => e, à => a, ç => c, ñ => n, ...)
2. suppression de tous les caractères non alphanumériques
3. mise en majuscule

Malheureusement, en base nous avons des n° simplifiés incorrects. J'essaie d'écrire une requête SQL permettant d'identifier tous ces cas. Je suis arrivé à ça:
Code :
1
2
3
4
SELECT DWG_NUMBER, DWG_NUMBER_SIMPLIFIED
FROM DWG
WHERE DWG_NUMBER_SIMPLIFIED NOT LIKE UPPER(REGEXP_REPLACE(TRANSLATE(DWG_NUMBER, 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïñòóôõöøùúûüý', 'aaaaaaaceeeeiiiinoooooouuuuyaaaaaaaceeeeiiiinoooooouuuuy'), '[^A-Za-z0-9]', ''))
ORDER BY DWG_NUMBER;
C'est assez bourrin et ça ne me satisfait pas (ma chef non plus d'ailleurs ^^).

J'ai testé avec
Code :
UPPER(REGEXP_REPLACE(CONVERT(DWG_NUMBER, 'US7ASCII'), '[^A-Za-z0-9]', ''))
mais ça ne prend pas en compte les ~. Or on en a pas mal !

Connaîtriez-vous une solution plus élégante ? D'avance merci !
papyreno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 15h21   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> 
SQL> WITH DATA AS (
  2    SELECT 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïñòóôõöøùúûüý' AS nom FROM dual
  3  )
  4  SELECT regexp_replace(
  5           regexp_replace(
  6             regexp_replace(
  7               regexp_replace(
  8                 regexp_replace(
  9                   regexp_replace(
 10                     regexp_replace(
 11                       regexp_replace(
 12                         regexp_replace(Upper(nom), '[[=A=]]','A')
 13                       ,'[[=E=]]','E')
 14                     ,'[[=N=]]','N')
 15                    ,'[[=O=]]','O')
 16                  ,'[[=U=]]','U')
 17                 ,'[[=I=]]','I')
 18               ,'[[=C=]]','C')
 19             ,'[[=Y=]]','Y')
 20           ,'[[=Æ=]]','?') Trans
 21  FROM DATA
 22  /
 
TRANS
--------------------------------------------------------
AAAAAA?CEEEEIIIINOOOOOOUUUUYAAAAAA?CEEEEIIIINOOOOOOUUUUY
 
SQL>
Mais, tout ça a l’air d’être terriblement inefficace.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2010, 13h01   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Avec LTRIM , tu enlèves toutes les bons caractères et si le résultat est NOT NULL, c'est que tout est bon.

Code :
1
2
3
4
SELECT DWG_NUMBER, DWG_NUMBER_SIMPLIFIED
FROM DWG
WHERE LTRIM(DWG_NUMBER_SIMPLIFIED, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') IS NOT NULL
ORDER BY DWG_NUMBER;

C'est une méthode que j'utilise fréquemment pour vérifier si un champ VARCHAR2 ne contient que des chiffres (en vérifiant si le résultat est NULL)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 16h54   #4
Membre du Club
 
AC
Inscription : octobre 2010
Messages : 28
Détails du profil
Informations personnelles :
Nom : AC
Âge : 43
Localisation : Suisse

Informations forums :
Inscription : octobre 2010
Messages : 28
Points : 48
Points : 48
Une petite fonction sans prétention...


Code :
1
2
3
4
5
6
7
CREATE OR REPLACE FUNCTION removeAccent (piString varchar2) RETURN varchar2
IS
c_source constant varchar2 (100) := 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïñòóôõöøùúûüý';
c_target constant varchar2 (100) := 'AAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaaceeeeiiiinoooooouuuuy';
begin
  RETURN translate (piString, c_source, c_target);
end;
et pour tester
Code :
SELECT removeAccent('Ülë èst le nöm de mâ côôpïne süèdoìse') FROM dual;
wahnfried est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 16h58   #5
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 64
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France

Informations forums :
Inscription : mai 2006
Messages : 64
Points : 25
Points : 25
Merci à tous pour vos réponses, je me garde ça sous le coude. On a décidé de remettre la résolution de ce problème à plus tard mais tout cela me sera utile quand je m'y remettrais ^^
papyreno est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h43.


 
 
 
 
Partenaires

Hébergement Web