J'ai une table comme celle-ci
Value String
-------------------
1 Cleo, Smith
Je veux séparer la chaîne délimitée par des virgules en deux colonnes
Value Name Surname
-------------------
1 Cleo Smith
J'ai besoin de seulement deux colonnes supplémentaires fixes
Réponses:
la source
WHILE
boucle (encore pire) ensemble fonctionneront terriblement. De plus, c'est une réponse basée uniquement sur le code et ne résout même pas le problème. Il existe de bien meilleures approches! Pour SQL-Server 2016+, recherchezSTRING_SPLIT()
(qui ne porte pas la position du fragment, un énorme échec!) Ou leJSON
-hack vraiment rapide . Pour les versions plus anciennes, recherchez le bien connu XML-hack (détails json et xml ici ). Ou recherchez l'un des iTVF de mai basés sur des CTE récursifs.SELECT * FROM STRING_SPLIT('John,Jeremy,Jack',',')
Votre objectif peut être résolu en utilisant la requête suivante -
Il n'y a pas de fonction Split prête à l'emploi dans le serveur SQL, nous devons donc créer une fonction définie par l'utilisateur.
la source
SELECT * FROM STRING_SPLIT('John,Jeremy,Jack',',')
et vérifiez également le lien ci-dessous pour référence
http://jahaines.blogspot.in/2009/06/converting-delimited-string-of-values.html
la source
CHARINDEX
plusSUBSTRING
, du moins pour moi. :-(CONVERT(XML,'<Names><name><![CDATA[' + REPLACE(Name,',', ']]></name><name><![CDATA[') + ']]></name></name>') AS xmlname
La réponse de base xml est simple et propre
référer ceci
la source
Je pense que c'est cool
la source
Avec CROSS APPLY
la source
Il existe plusieurs façons de résoudre ce problème et de nombreuses façons différentes ont déjà été proposées. Le plus simple serait d'utiliser
LEFT
/SUBSTRING
et d'autres fonctions de chaîne pour obtenir le résultat souhaité.Exemple de données
Utilisation de fonctions de chaîne comme
LEFT
Cette approche échoue s'il y a plus de 2 éléments dans une chaîne. Dans un tel scénario, nous pouvons utiliser un séparateur, puis utiliser
PIVOT
ou convertir la chaîne en unXML
et l'utiliser.nodes
pour obtenir des éléments de chaîne.XML
basé sur la solution ont été détaillés par aads et bvr dans leur solution.Les réponses à cette question qui utilisent le séparateur, utilisent toutes
WHILE
ce qui est inefficace pour le fractionnement. Vérifiez cette comparaison de performances . L'un des meilleurs séparateurs estDelimitedSplit8K
, créé par Jeff Moden. Vous pouvez en savoir plus iciSplitter avec
PIVOT
Production
DelimitedSplit8K
par Jeff Modenla source
Essayez ceci (changez les instances de «» en «,» ou tout autre délimiteur que vous souhaitez utiliser)
Exemple d'utilisation:
la source
Avec SQL Server 2016, nous pouvons utiliser string_split pour accomplir ceci:
la source
Invalid object name 'string_split'
DECLARE @cl TINYINT; SELECT @cl = compatibility_level FROM [sys].[databases] WHERE name = 'mydb'; IF @cl < 130 BEGIN ALTER DATABASE myDb SET COMPATIBILITY_LEVEL = 130 END;
Je pense que PARSENAME est la fonction intéressante à utiliser pour cet exemple, comme décrit dans cet article: http://www.sqlshack.com/parsing-and-rotating-delimited-data-in-sql-server-2012/
La fonction PARSENAME est logiquement conçue pour analyser les noms d'objets en quatre parties. La bonne chose à propos de PARSENAME est qu'il ne se limite pas à l'analyse des noms d'objets en quatre parties SQL Server - il analysera toutes les données de fonction ou de chaîne délimitées par des points.
Le premier paramètre est l'objet à analyser et le second est la valeur entière de l'élément d'objet à renvoyer. L'article traite de l'analyse et de la rotation des données délimitées - numéros de téléphone de l'entreprise, mais il peut également être utilisé pour analyser les données de nom / prénom.
Exemple:
L'article décrit également l'utilisation d'une expression de table commune (CTE) appelée «replaceChars», pour exécuter PARSENAME sur les valeurs remplacées par le délimiteur. Un CTE est utile pour renvoyer une vue temporaire ou un jeu de résultats.
Après cela, la fonction UNPIVOT a été utilisée pour convertir certaines colonnes en lignes; Les fonctions SUBSTRING et CHARINDEX ont été utilisées pour nettoyer les incohérences dans les données, et la fonction LAG (nouvelle pour SQL Server 2012) a été utilisée à la fin, car elle permet de référencer les enregistrements précédents.
la source
la source
Nous pouvons créer une fonction comme ceci
Nous pouvons ensuite séparer les valeurs CSV dans nos colonnes respectives à l'aide d'une instruction SELECT
la source
Je pense que la fonction suivante fonctionnera pour vous:
Vous devez d'abord créer une fonction dans SQL. Comme ça
Vous pouvez appeler cette fonction, comme ceci:
La mise en oeuvre:
Le résultat aimera ceci:
la source
Vous pouvez utiliser une table d'une valeur fonction
STRING_SPLIT
, qui est disponible uniquement sous le niveau de compatibilité 130. Si votre niveau de compatibilité de base de données est inférieure à 130, SQL Server ne sera pas en mesure de trouver et d' exécuter laSTRING_SPLIT
fonction. Vous pouvez modifier un niveau de compatibilité de la base de données à l'aide de la commande suivante:Syntaxe
voir la documentation ici
la source
Utiliser la fonction Parsename ()
Résultat
la source
Essaye ça:
la source
J'ai rencontré un problème similaire mais complexe et comme il s'agit du premier fil de discussion que j'ai trouvé concernant ce problème, j'ai décidé de publier ma conclusion. Je sais que c'est une solution complexe à un problème simple mais j'espère que je pourrais aider d'autres personnes qui vont à ce fil à la recherche d'une solution plus complexe. J'ai dû diviser une chaîne contenant 5 nombres (nom de colonne: levelsFeed) et afficher chaque nombre dans une colonne séparée. par exemple: 8,1,2,2,2 doit être affiché comme suit:
Solution 1: utiliser les fonctions XML: cette solution pour la solution la plus lente de loin
Solution 2: utiliser la fonction Split et le pivot. (la fonction de fractionnement divise une chaîne en lignes avec le nom de colonne Data)
Solution 3: utilisation des fonctions de manipulation de chaînes - le plus rapide avec une petite marge par rapport à la solution 2
puisque le levelFeed contient 5 valeurs de chaîne dont j'avais besoin pour utiliser la fonction de sous-chaîne pour la première chaîne.
j'espère que ma solution aidera les autres qui sont arrivés à ce fil à la recherche d'une méthode plus complexe de fractionnement en colonnes
la source
Utilisation de la fonction instring :)
Utilisé deux fonctions,
1.
substring(string, position, length)
==> renvoie la chaîne de la position à la longueur2.
instr(string,pattern)
==> renvoie la position du motif.Si nous ne fournissons pas d'argument de longueur dans la sous-chaîne, il retourne jusqu'à la fin de la chaîne
la source
substring(@str, 1, charindex(@sep, @str) - 1)
suivi desubstring(@str, charindex(@sep, @str) + 1, len(@str))
.Cette fonction est la plus rapide:
Exemple d'utilisation:
la source
Cela a fonctionné pour moi
la source
ma table:
Ce qui suit devrait fonctionner s'il n'y a pas trop de colonnes
Résultat:
la source
c'est si simple, vous pouvez le prendre par la requête ci-dessous:
la source
la source
Vous pouvez trouver la solution dans la fonction définie par l'utilisateur SQL pour analyser une chaîne délimitée utile (de The Code Project ).
Voici la partie code de cette page:
la source
la source
J'ai trouvé que l'utilisation de PARSENAME comme ci-dessus provoquait l'annulation de tout nom avec un point.
Donc, s'il y avait une initiale ou un titre dans le nom suivi d'un point, ils renvoient NULL.
J'ai trouvé que cela fonctionnait pour moi:
la source
la source
la source
J'ai réécrit une réponse ci-dessus et je l'ai améliorée:
Exemple d'utilisation:
la source
la source