J'ai une colonne qui a des valeurs formatées comme a, b, c, d. Existe-t-il un moyen de compter le nombre de virgules dans cette valeur dans T-SQL?
sql-server
tsql
Orion Adrian
la source
la source
LTRIM
autour de la chaîne comme suit:SELECT LEN(RTRIM(@string)) - LEN(REPLACE(RTRIM(@string), ',', ''))
?Extension rapide de la réponse de cmsjr qui fonctionne pour les chaînes de plus que plus de caractères.
Usage:
la source
dbo.CountOccurancesOfString( 'blah ,', ',')
retournera donc 2 au lieu de 1 etdbo.CountOccurancesOfString( 'hello world', ' ')
échouera avec une division par zéro.DATALENGTH()/2
est également délicat à cause des tailles de caractères non évidentes. Regardez stackoverflow.com/a/11080074/1094048 pour une manière simple et précise.Vous pouvez comparer la longueur de la chaîne avec celle où les virgules sont supprimées:
la source
En vous basant sur la solution de @ Andrew, vous obtiendrez de bien meilleures performances en utilisant une fonction table non procédurale et CROSS APPLY:
la source
La réponse de @csmjr pose un problème dans certains cas.
Sa réponse a été de faire ceci:
Cela fonctionne dans la plupart des scénarios, cependant, essayez d'exécuter ceci:
Pour une raison quelconque, REPLACE supprime la virgule finale mais AUSSI l'espace juste avant (je ne sais pas pourquoi). Cela se traduit par une valeur renvoyée de 5 lorsque vous vous attendez à 4. Voici une autre façon de procéder qui fonctionnera même dans ce scénario spécial:
Notez que vous n'avez pas besoin d'utiliser d'astérisques. Tout remplacement de deux caractères fera l'affaire. L'idée est d'allonger la chaîne d'un caractère pour chaque instance du caractère que vous comptez, puis de soustraire la longueur de l'original. C'est fondamentalement la méthode opposée de la réponse originale qui ne vient pas avec l'étrange effet secondaire de coupe.
la source
la source
La réponse acceptée est correcte, l'étendant pour utiliser 2 caractères ou plus dans la sous-chaîne:
la source
Si nous savons qu'il existe une limitation de la LEN et de l'espace, pourquoi ne pouvons-nous pas remplacer l'espace en premier? Ensuite, nous savons qu'il n'y a pas de place pour confondre LEN.
la source
la source
Je pense que Darrel Lee a une assez bonne réponse. Remplacez
CHARINDEX()
parPATINDEX()
, et vous pouvez également effectuer uneregex
recherche faible le long d'une chaîne ...Comme, disons que vous utilisez ceci pour
@pattern
:Pourquoi voudriez-vous peut-être faire quelque chose de fou comme ça?
Supposons que vous chargiez des chaînes de texte délimitées dans une table intermédiaire, où le champ contenant les données ressemble à un varchar (8000) ou un nvarchar (max) ...
Parfois, il est plus facile / plus rapide de faire ELT (Extract-Load-Transform) avec des données plutôt que ETL (Extract-Transform-Load), et une façon de le faire est de charger les enregistrements délimités tels quels dans une table intermédiaire, en particulier si vous voudrez peut-être un moyen plus simple de voir les enregistrements exceptionnels plutôt que de les traiter dans le cadre d'un package SSIS ... mais c'est une guerre sainte pour un thread différent.
la source
Ce qui suit devrait faire l'affaire pour les recherches à un seul caractère et à plusieurs caractères:
La fonction peut être un peu simplifiée à l'aide d'une table de nombres (dbo.Nums):
la source
Utilisez ce code, il fonctionne parfaitement. J'ai créé une fonction sql qui accepte deux paramètres, le premier paramètre est la longue chaîne que nous voulons rechercher, et elle peut accepter une longueur de chaîne allant jusqu'à 1500 caractères (bien sûr, vous pouvez l'étendre ou même la changer en type de données texte ). Et le deuxième paramètre est la sous-chaîne dont nous voulons calculer le numéro de son occurrence (sa longueur peut aller jusqu'à 200 caractères, bien sûr, vous pouvez la modifier selon vos besoins). et la sortie est un entier, représente le nombre de fréquence ..... profitez-en.
la source
J'écris enfin cette fonction qui devrait couvrir toutes les situations possibles, en ajoutant un préfixe char et un suffixe à l'entrée. ce caractère est évalué comme étant différent de tout caractère contenu dans le paramètre de recherche, il ne peut donc pas affecter le résultat.
usage
la source
la source
Dans SQL 2017 ou version ultérieure, vous pouvez utiliser ceci:
la source
ce code T-SQL trouve et imprime toutes les occurrences du motif @p dans la phrase @s. vous pouvez faire n'importe quel traitement sur la phrase par la suite.
le résultat est: 1 6 13 20
la source
pour SQL Server 2017
la source
Vous pouvez utiliser la procédure stockée suivante pour récupérer des valeurs.
la source
@c1
la réponse qu'il requiert. À quoi sert le reste du code, étant donné qu'il a besoin d'une table préexistante appeléetable1
pour fonctionner, a un délimètre codé en dur et ne peut pas être utilisé en ligne comme la réponse acceptée de deux mois auparavant?Le test Replace / Len est mignon, mais probablement très inefficace (surtout en termes de mémoire). Une simple fonction avec une boucle fera l'affaire.
la source
Vous ne devriez peut-être pas stocker les données de cette façon. Il est déconseillé de stocker une liste délimitée par des virgules dans un champ. L'IT est très inefficace pour les requêtes. Cela devrait être une table liée.
la source