D'autres réponses ici, pour ne pas prendre en considération si vous avez tous les zéro (ou même un seul zéro).
Certains toujours par défaut est une chaîne vide à zéro, ce qui est mauvais quand il est censé rester vide.
Re-lecture de la question d'origine. Ceci répond à ce que l'Interlocuteur veut.
Solution (avec les données de l'échantillon):
SELECT O.Type, O.Value, Parsed.Value[WrongValue],
(CASE WHEN CHARINDEX('0', T.Value) > 0--If there's at least one zero.
AND LEN(Parsed.Value) = 0--And the trimmed length is zero.
THEN '0' ELSE Parsed.Value END)[FinalValue],
(CASE WHEN CHARINDEX('0', T.Value) > 0--If there's at least one zero.
AND LEN(Parsed.TrimmedValue) = 0--And the trimmed length is zero.
THEN '0' ELSE LTRIM(RTRIM(Parsed.TrimmedValue)) END)[FinalTrimmedValue]
FROM
(
VALUES ('Null', NULL), ('EmptyString', ''),
('Zero', '0'), ('Zero', '0000'), ('Zero', '000.000'),
('Spaces', ' 0 A B C '), ('Number', '000123'),
('AlphaNum', '000ABC123'), ('NoZero', 'NoZerosHere')
) AS O(Type, Value)--O is for Original.
CROSS APPLY
( --This Step is Optional. Use if you also want to remove leading spaces.
SELECT LTRIM(RTRIM(O.Value))[Value]
) AS T--T is for Trimmed.
CROSS APPLY
( --From @CadeRoux's Post.
SELECT SUBSTRING(O.Value, PATINDEX('%[^0]%', O.Value + '.'), LEN(O.Value))[Value],
SUBSTRING(T.Value, PATINDEX('%[^0]%', T.Value + '.'), LEN(T.Value))[TrimmedValue]
) AS Parsed
Résultats:
Résumé:
Vous pouvez utiliser ce que j'ai ci-dessus pour un retrait de la pointe de zéro.
Si vous prévoyez de réutiliser un lot, puis le placer dans un Inline-Table-Fonction (ITVF).
Vos préoccupations au sujet des problèmes de performances avec l'UDF est compréhensible.
Toutefois, ce problème ne s'applique à Tous-Scalaire-Fonctions et Multi-Déclaration de la Table des Fonctions.
À l'aide de ITVF est parfaitement bien.
J'ai le même problème avec notre de la 3e Partie de la base de données.
Avec des Alpha-Numérique des champs beaucoup sont entrés dans sans les espaces, dang les humains!!!
Cela rend rejoint impossible sans le nettoyage de la manque à la pointe des zéros.
Conclusion:
Au lieu de supprimer l'avant-zéros, vous pouvez envisager de rembourrage votre garnis de valeurs avec des zéros lorsque vous faites vos jointures.
Je pense que ce serait plus rapide et moins complexe.
SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF(' 0A10 ', ''))), 10)--0000000A10
SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF('', ''))), 10)--NULL --When Blank.