J'ai une table SQL comme celle-ci:
| SomeID | OtherID | Data
+----------------+-------------+-------------------
| abcdef-..... | cdef123-... | 18,20,22
| abcdef-..... | 4554a24-... | 17,19
| 987654-..... | 12324a2-... | 13,19,20
y a-t-il une requête où je peux effectuer une requête comme SELECT OtherID, SplitData WHERE SomeID = 'abcdef-.......'
celle-ci renvoie des lignes individuelles, comme ceci:
| OtherID | SplitData
+-------------+-------------------
| cdef123-... | 18
| cdef123-... | 20
| cdef123-... | 22
| 4554a24-... | 17
| 4554a24-... | 19
Fondamentalement, diviser mes données à la virgule en lignes individuelles?
Je suis conscient que le stockage d'une comma-separated
chaîne dans une base de données relationnelle semble stupide, mais le cas d'utilisation normal dans l'application grand public le rend vraiment utile.
Je ne veux pas faire la division dans l'application car j'ai besoin de pagination, donc je voulais explorer les options avant de refactoriser l'application entière.
C'est SQL Server 2008
(non-R2).
sql-server
tsql
split
comma
Michael Stum
la source
la source
Réponses:
Vous pouvez utiliser les merveilleuses fonctions récursives de SQL Server:
Exemple de tableau:
La requête
Production
la source
Data
devarchar(max)
àvarchar(4000)
, par exemplecreate table Testdata(SomeID int, OtherID int, Data varchar(4000))
?OPTION (maxrecursion 0)
Enfin, l'attente est terminée avec SQL Server 2016 . Ils ont introduit la fonction de chaîne Split,
STRING_SPLIT
:Toutes les autres méthodes pour diviser une chaîne comme XML, table Tally, boucle while, etc. ont été supprimées par cette
STRING_SPLIT
fonction.Voici un excellent article avec une comparaison des performances: Surprises et hypothèses de performances: STRING_SPLIT .
Pour les versions antérieures, l' utilisation de la table de pointage est une fonction de chaîne fractionnée (meilleure approche possible)
Renvoyé de Tally OH! Une fonction SQL 8K «CSV Splitter» améliorée
la source
value
pasSplitData
.Vérifie ça
la source
la source
CROSS APPLY
, c'est un peu utile!select t.OtherID, x.* from testData t cross apply (select item as Data from dbo.Split(t.Data,',') ) x
En février 2016 - voir l'exemple de tableau TALLY - très susceptible de surpasser mon TVF ci-dessous, à partir de février 2014. Conserver le post d'origine ci-dessous pour la postérité:
Trop de code répété à mon goût dans les exemples ci-dessus. Et je n'aime pas les performances des CTE et XML. En outre, une explicite
Id
afin que les consommateurs spécifiques à une commande puissent spécifier uneORDER BY
clause.la source
C'est bien de voir que cela a été résolu dans la version 2016, mais pour tous ceux qui n'y figurent pas, voici deux versions généralisées et simplifiées des méthodes ci-dessus.
La méthode XML est plus courte, mais nécessite bien sûr la chaîne pour permettre l'astuce xml (pas de «mauvais» caractères.)
Méthode XML:
Méthode récursive:
Fonction en action
XML-METHOD 2: Unicode Friendly 😀 (avec l'aimable autorisation de Max Hodges)
create function dbo.splitString(@input nVarchar(max), @Splitter nVarchar(99)) returns table as Return SELECT Split.a.value('.', 'NVARCHAR(max)') AS Data FROM ( SELECT CAST ('<M>' + REPLACE(@input, @Splitter, '</M><M>') + '</M>' AS XML) AS Data ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a);
la source
Veuillez vous référer ci-dessous TSQL. La fonction STRING_SPLIT n'est disponible qu'au niveau de compatibilité 130 et supérieur.
TSQL:
RÉSULTAT:
Couleur
rouge bleu vert jaune noir
la source
Très tard, mais essayez ceci:
Nous avions donc ceci: tbl_Sample:
Après avoir exécuté cette requête:
Merci!
la source
STRING_SPLIT
est astucieux mais il nécessite SQL Server 2016. docs.microsoft.com/en-us/sql/t-sql/functions/…la source
avec seulement une toute petite modification à la requête ci-dessus ...
la source
J'utilise toujours la méthode XML. Assurez-vous d'utiliser XML VALIDE. J'ai deux fonctions pour convertir entre XML valide et texte. (J'ai tendance à supprimer les retours de chariot car je n'en ai généralement pas besoin.
la source
SELECT (SELECT '<&> blah' + CHAR(13)+CHAR(10) + 'next line' FOR XML PATH(''))
Fonction
Cas d'utilisation
Ou simplement une sélection avec plusieurs jeux de résultats
la source
Ci-dessous fonctionne sur SQL Server 2008
Obtiendra tous les produits cartésiens avec les colonnes de la table d'origine plus les "éléments" de la table fractionnée.
la source
Vous pouvez utiliser la fonction suivante pour extraire des données
la source