2017-09-19 2 views
0

J'ai une énorme liste de données client. Je veux obtenir seulement le code postal de 5 chiffres de la colonne Address1.TSQL: Comment extraire uniquement une longueur fixe de nombres de la chaîne

J'ai le code désordre ci-dessous:

SELECT 
    (SELECT LEFT(SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000), 
     PATINDEX('%[^0-9]%', SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000) + 'X') -1)) 
FROM CustomerList where LEN(LEFT(SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000), 
     PATINDEX('%[^0-9]%', SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000) + 'X') -1)) = 5 -- Get only records that has exactly 5 value 

Pour le code ci-dessus, les données suivantes fonctionneront:

"Str Jt Jones 40030.." - Peut obtenir "40030"

Mais les données suivantes ne fonctionnent pas:

"22 rue Mel 50630" - Peut seulement obtenir "22" numéro de rue, pas de code postal.

"65-31 Kampar 47000 Bau" - peut seulement obtenir 65

"Lot 199 Guasa 30990 Omar" - ne peuvent obtenir 199

Alors mon code peut obtenir les enregistrements qui ont le code postal ne. Si le Address1 contient d'autres nombres, cela ne fonctionne pas.

Aidez-nous s'il vous plaît.

EDIT:

Apparemment, mon code actuel est de commencer à lire les chiffres de `GAUCHE », est-il possible que je peux modifier le code actuel pour commencer à lire de droite à la place?

+0

Le code postal dans vos données est toujours à la fin/la dernière partie de l'adresse? – Tyron78

+0

Si vous avez une énorme liste de données, le code postal doit être un champ * séparé *. Imaginez que vous analysiez 1M lignes à chaque fois que vous vouliez rechercher un * code postal. –

+0

@PanagiotisKanavos Les données sont fournies par le client, donc j'ai besoin de filtrer et séparer à une autre colonne maintenant. –

Répondre

2

Qu'en est-stripping simplement la dernière partie de vos adresses? Tels que:

DECLARE @Address1 NVARCHAR(100) = 'Lot 199 Guasa 30990 Omar'; 
SELECT 
    (SELECT REVERSE(LEFT(SUBSTRING(REVERSE(@Address1), PATINDEX('%[0-9]%', REVERSE(@Address1)), 8000), 
    PATINDEX('%[^0-9]%', SUBSTRING(REVERSE(@Address1), PATINDEX('%[0-9]%', REVERSE(@Address1)), 8000) + 'X') -1))) AS PostCode 
+0

Désolé je viens d'ajouter 2 autres données, qui utilisent 'RIGHT' ne fonctionne pas parce que le code postal n'est pas exactement à la dernière partie –

+0

J'ai modifié la requête: en utilisant votre Regexp sur la chaîne inversée et en inversant le résultat une fois de plus. .. – Tyron78

+0

wow nice. Apprenez quelque chose de nouveau sur 'REVERSE'. Merci beaucoup, j'apprécie vraiment –

0

Avec des exemples que vous publiez, vous pouvez essayer d'utiliser quelque chose comme ceci:

WITH X AS (SELECT '65-31 Kampar 47000 Bau' AS A UNION ALL SELECT 'Str. Jt. Jones 40030' UNION ALL SELECT 'Lot 199 Guasa 30990 Omar' ) 

SELECT REVERSE(SUBSTRING(REVERSE(A), patindex('%[0-9]%', REVERSE(A)) ,5)) FROM X 

Sortie:

47000 
40030 
30990