2017-06-15 3 views
0

Sur le serveur SQL, j'ai des valeurs VARCHAR.Chaîne de serveur SQL ou manipulation de VARCHAR contenant des valeurs numériques

J'ai besoin d'une vue qui reformate automatiquement les données.

Les données stockées sous la forme suivante:

[email protected] 
[email protected] 
[email protected] 

doit être reformaté dans les éléments suivants:

hawthorn [email protected]  
scotland [email protected] 0003  
[email protected] 

reformatage

  • Les valeurs numériques dans les chaînes sont complétées par des zéros à la longueur du plus long nombre
  • Tous les autres caractères sont remplis avec des caractères espace pour aligner les nombres.

Est-ce que quelqu'un sait comment cela est fait?

Remarque: Gardez à l'esprit qu'une chaîne peut contenir n'importe quelle combinaison de mots et de nombres.

+0

Bonne chance à cette fin dans SQL pur avec regExps et de chaîne. Implémenter un algorithme dans une procédure stockée est probablement votre seul moyen de le faire du côté de la base de données, mais je préfère le coder avec un vrai langage de programmation. –

+0

Peut-être pas la meilleure offre, mais je vous conseillerais de revoir ce que et comment vous stockez des données dans votre base de données. –

Répondre

0

Vous devez diviser vos valeurs en 4 colonnes (pour trouver la longueur maximale dans chaque colonne), puis ajouter des zéros/espaces avant/arrière, puis la concaténer.

Code est ici pour diviser les valeurs, espérons que vous aurez aucun problème avec l'ajout de zéros et des espaces:

declare @v varchar(255) = '[email protected]' 
select 
    FirstPart = left(@v, patindex('%[a-z][0-9]%', @v)), 
    SecondPart = substring(@v, patindex('%[0-9]%', @v), patindex('%[0-9][a-z]%', @v) - patindex('%[a-z][0-9]%', @v)), 
    ThirdPart = substring(@v, patindex('%[0-9][a-z]%', @v) + 1, len(@v) - patindex('%[0-9][a-z]%', @v) - patindex('%[0-9][a-z]%', reverse(@v))), 
    Fourthpart = right(@v, patindex('%[0-9][a-z]%', reverse(@v))) 

Notes: - (? Surnom)

patindex('%[a-z][0-9]%', @v) Dernière lettre en aubépine

patindex('%[0-9][a-z]%', @v) - Dernier chiffre du premier numéro (104)

patindex('%[0-9][a-z]%', reverse(@v)) - Longueur du dernier numéro

Vous pouvez également utiliser CLR et RegEx pour diviser les valeurs aux groupes: https://github.com/zzzprojects/Eval-SQL.NET/wiki/SQL-Server-Regex-%7C-Use-regular-expression-to-search,-replace-and-split-text-in-SQL

0

Vous pouvez utiliser PATINDEX

declare @str varchar(100)='[email protected]' 

SELECT SUBSTRING(@str,0,PATINDEX('%[0-9]%',@str)), 
     SUBSTRING(@str,PATINDEX('%[0-9]%',@str),LEN(@str)-LEN(SUBSTRING(@str,0,PATINDEX('%[0-9]%',@str))))