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 09/12/2011, 16h59   #1
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
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 313
Points : 5 817
Points : 5 817
Par défaut Vérifier un numéro SIRET (la formule de Luhn)

Je voudrai partager ce code SQL pour vérifier un numéro SIRET en utilisant la formule de Luhn
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> 
SQL> WITH DirtyData AS (  -- les données initiales
  2    SELECT '73282932000074' num_siret FROM dual Union ALL
  3    SELECT '37282932000074' num_siret FROM dual Union ALL
  4    SELECT '37282932000'    num_siret FROM dual Union ALL
  5    SELECT '00000000000000' num_siret FROM Dual Union ALL
  6    SELECT NULL             num_siret FROM Dual Union ALL
  7    SELECT 'N''importe quoi' num_siret FROM Dual
  8  ), DATA AS (   -- les données filtrèes
  9    SELECT rownum, num_siret
 10      FROM Dirtydata
 11     WHERE num_siret IS NOT NULL
 12       AND num_siret != '00000000000000'
 13       AND Length(num_siret) = 14
 14       AND Translate(num_siret, '#0123456789','#') IS NULL
 15  ), Generator AS (  -- pour multiplier les enregistrements
 16    SELECT rownum rn
 17      FROM Dual
 18     Connect BY Level <= 14
 19     ORDER BY rn
 20  ), Digits AS (     -- le produit cartésien
 21    SELECT num_siret, rn,
 22             SubStr(num_siret, -rn, 1) Digit  -- on commence par la fin de la chaîne
 23      FROM DATA
 24           CROSS JOIN
 25           Generator
 26  ), LuhnFormula AS (
 27  SELECT num_siret, rn, Digit,
 28         Case BitAnd(rn, 1)         -- position pair/impair
 29           When 0 Then
 30             Translate(Digit,'0123456789','0246813579')  -- formule de Luhn
 31           Else
 32             Digit
 33         End LuhnDigits
 34    FROM Digits
 35  )
 36  SELECT num_siret,
 37         case Mod(Sum(LuhnDigits),10)  -- le test de Luhn
 38           When 0 Then
 39             'OK'
 40           Else
 41             'KO'
 42         End STATUS
 43    FROM LuhnFormula
 44   GROUP BY num_siret
 45   ORDER BY STATUS
 46  /
 
NUM_SIRET      STATUS
-------------- ------
37282932000074 KO
73282932000074 OK
 
SQL>
Qui sait, peut être ça servira un jour à quelqu'un.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h21.


 
 
 
 
Partenaires

Hébergement Web