SÉLECTIONNEZ à partir de la 3ème virgule dans la chaîne de
J'ai la chaîne suivante:
bzip2,1,668,sometext,foo,bar
Comment puis-je SÉLECTIONNER uniquement sometext,foo,bar
? La longueur de la chaîne précédant le 3ème virgule peut varier et il peut y avoir des virgules dans la sometext,foo,bar
.
J'aimerais que cela soit code concis que possible, de préférence de 1 ligne de code, pas de boucles. Mais n'hésitez pas à poster toute solution que vous pensez.
- Cela n'a absolument zéro à voir avec la question.
- Peut-être cela peut vous aider: stackoverflow.com/questions/8726111/...
- Sera-t-il toujours être exactement 3 virgules (4 "éléments") ?
- Il n'est pas séparation par virgule valeurs. C'est un BZ comprimé chaîne. Chaque ligne a un autre de la chaîne. S'il vous plaît faire confiance à la question ici, il est parfaitement valide.
- C'est ce que je voulais dire par "il y a peut être des virgules dans la
sometext
". Il y a peut être 100 des virgules. - J'ai édité la question si nous nous arrêtons à obtenir des réponses qui ne tiennent pas compte du fait qu'il peut y avoir des virgules dans le reste de la chaîne. Dans l'avenir, merci de faire de ce cas plus évident à l'avant.
- Depuis @a_horse_with_no_name post a maintenant 8 upvotes, je vais vous expliquer un peu pourquoi j'ai quelque chose comme cela dans une base de données. Une application externe magasins BZ2-comprimé de texte enrichi de notes dans cette colonne. Il ajoute automatiquement 'bzip2,1,668," au début de chaque chaîne de caractères (le nombre peut varier à chaque fois). Afin de décompresser de la chaîne, j'ai besoin de supprimer ce préfixe, sinon BZDecompress retourne qu'il n'est pas valide BZ chaîne. Rien à voir avec le stockage de données; et certainement pas quelque chose qui peut être normalisées.
- Vous devriez avoir ajouté cette explication dès le début.
Vous devez vous connecter pour publier un commentaire.
essayez ceci:
Faire une sous-chaîne à partir de la 3e virgule à la fin de la chaîne.. Pour trouver les 3 virgules , je suis en utilisant charindex() fonction 3 fois
résultat:
CHARINDEX
s, ainsi que ma réponse. Une meilleure solution est:declare @v varchar(max) = 'bzip2,1,668,sometext' select substring(@v, CHARINDEX(',', @v, CHARINDEX(',', @v, CHARINDEX(',', @v)+1)+1)+1, len(@v))
(comme je l'ai posté ma réponse).Code:
De sortie:
Modifier
Ajouté nullif à la troisième virgule calcul de la partie, sans eux, il est possible d'obtenir des résultats incohérents.
Voici une autre idée
Résultat
Je viens de comprendre quelque chose qui fonctionne:
1
's et@v
'sCHARINDEX()