Je voudrai partager ce code SQL pour vérifier un numéro SIRET en utilisant la formule de Luhn
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.