J'utilise ceci depuis un certain temps:
SUBSTRING(str_col, PATINDEX('%[^0]%', str_col), LEN(str_col))
Cependant, récemment, j'ai trouvé un problème avec les colonnes avec tous les caractères "0" comme "00000000" car il ne trouve jamais un caractère non "0" correspondant.
Une technique alternative que j'ai vue est d'utiliser TRIM
:
REPLACE(LTRIM(REPLACE(str_col, '0', ' ')), ' ', '0')
Cela pose un problème s'il y a des espaces incorporés, car ils seront transformés en "0" lorsque les espaces seront reconvertis en "0".
J'essaye d'éviter un UDF scalaire. J'ai trouvé de nombreux problèmes de performances avec les UDF dans SQL Server 2005.
sql
sql-server
sql-server-2005
tsql
string
Cade Roux
la source
la source
Réponses:
la source
Arvo
sur SO!Pourquoi ne pas simplement attribuer la valeur à
INTEGER
, puis revenir àVARCHAR
?la source
SELECT CASE ISNUMERIC(str_col) WHEN 1 THEN CAST(CAST(str_col AS BIGINT) AS VARCHAR(255)) ELSE str_col END
BIGINT
, certains types de chaîne échoueront toujours cette conversion. Considérez0001E123
par exemple.D'autres réponses ici à ne pas prendre en compte si vous avez des zéros (ou même un seul zéro).
Certains mettent toujours par défaut une chaîne vide à zéro, ce qui est faux quand elle est censée rester vide.
Relisez la question initiale. Cela répond à ce que veut le questionneur.
Solution n ° 1:
Solution n ° 2 (avec des exemples de données):
Résultats:
Résumé:
Vous pouvez utiliser ce que j'ai ci-dessus pour une suppression ponctuelle des zéro non significatifs.
Si vous prévoyez de le réutiliser beaucoup, placez-le dans un Inline-Table-Valued-Function (ITVF).
Vos préoccupations concernant les problèmes de performance avec les UDF sont compréhensibles.
Toutefois, ce problème s'applique uniquement à All-Scalar-Functions et Multi-Statement-Table-Functions.
Utiliser ITVF est parfaitement bien.
J'ai le même problème avec notre base de données tierce.
Avec les champs alphanumériques, beaucoup sont entrés sans les espaces principaux, dang humains!
Cela rend les jointures impossibles sans nettoyer les zéros de tête manquants.
Conclusion:
Au lieu de supprimer les zéros non significatifs, vous pouvez envisager de simplement compléter vos valeurs découpées avec des zéros non significatifs lorsque vous effectuez vos jointures.
Mieux encore, nettoyez vos données dans le tableau en ajoutant des zéros non significatifs, puis en reconstruisant vos index.
Je pense que ce serait bien plus rapide et moins complexe.
la source
Au lieu d'un espace, remplacez les 0 par un caractère d'espacement «rare» qui ne devrait normalement pas être dans le texte de la colonne. Un saut de ligne est probablement suffisant pour une colonne comme celle-ci. Ensuite, vous pouvez LTrim normalement et remplacer à nouveau le caractère spécial par des 0.
la source
Ce qui suit renverra '0' si la chaîne se compose entièrement de zéros:
la source
Cela fait une belle fonction ...
la source
cast (valeur comme int) fonctionnera toujours si la chaîne est un nombre
la source
Ma version de ceci est une adaptation du travail d'Arvo, avec un peu plus ajouté pour assurer deux autres cas.
1) Si nous avons tous les 0, nous devons renvoyer le chiffre 0.
2) Si nous avons un blanc, nous devrions toujours renvoyer un caractère vide.
la source
La suggestion de Thomas G a fonctionné pour nos besoins.
Le champ dans notre cas était déjà une chaîne et seuls les zéros de tête devaient être coupés. La plupart du temps, tout est numérique, mais parfois il y a des lettres, donc la conversion INT précédente plantait.
la source
Cela a une limite sur la longueur de la chaîne qui peut être convertie en INT
la source
Si vous utilisez Snowflake SQL, vous pouvez utiliser ceci:
La fonction ltrim supprime toutes les instances du jeu de caractères désigné du côté gauche.
Donc ltrim (str_col, '0') sur '00000008A' renverrait '8A'
Et rtrim (str_col, '0.') Sur '125,00 $' renverrait '125 $'
la source
Fonctionne bien même avec «0», «00» et ainsi de suite.
la source
Essaye ça:
la source
Si vous ne souhaitez pas convertir en int, je préfère cette logique ci-dessous car elle peut gérer les valeurs nulles IFNULL (field, LTRIM (field, '0'))
la source
Dans MySQL, vous pouvez le faire ...
la source