Vous pouvez profiter du support XML de SQL Server pour convertir la chaîne d'entrée en une valeur XML et d'interroger avec XQuery et expressions XPath .
Par exemple, la requête suivante remplacera chaque ;
avec </b><a>
et chaque ,
-</a><b>
pour transformer chaque chaîne en <a>100000161</a><a>100000243</a><a />
. Après cela, vous pouvez sélectionner <a>
individuels noeuds avec /a[1]
, /a[2]
:
declare @table table (it nvarchar(200))
insert into @table values
('100000161, 100000031; 100000243, 100000021;'),
('100000161, 100000031; 100000243, 100000021;')
select
xCol.value('/a[1]','nvarchar(200)'),
xCol.value('/a[2]','nvarchar(200)')
from (
select convert(xml, '<a>'
+ replace(replace(replace(it,';','</b><a>'),',','</a><b>'),' ','')
+ '</a>')
.query('a') as xCol
from @table) as tmp
-------------------------
A1 A2
100000161 100000243
100000161 100000243
value
extrait une valeur unique à partir d'un champ XML. nodes
renvoie une table de nœuds correspondant à l'expression XPath. La requête suivante renverra toutes les « clés »:
select
a.value('.','nvarchar(200)')
from (
select convert(xml, '<a>'
+ replace(replace(replace(it,';','</b><a>'),',','</a><b>'),' ','')
+ '</a>')
.query('a') as xCol
from @table) as tmp
cross apply xCol.nodes('a') as y(a)
where a.value('.','nvarchar(200)')<>''
------------
100000161
100000243
100000161
100000243
Avec 200K lignes de données mais, je sérieusement envisager de transformer les données lors de son chargement et son stockage dans les colonnes Indivisual, indexables, ou ajouter une séparée , table connexe. L'application de fonctions de manipulation de chaînes sur une colonne signifie que le serveur ne peut utiliser aucun index de couverture pour accélérer les requêtes.
Si ce n'est pas possible (pourquoi?) Je considérerais au moins l'ajout d'une colonne distincte de type XML qui contiendrait les mêmes données sous forme XML, pour permettre la création d'un index XML.
SQL Server est connu parmi les bases de données d'entreprise pour avoir un support de remplacement de regex assez moche, ce qui est probablement ce que vous souhaitez utiliser pour ce problème.Y a-t-il une chance que vous puissiez nettoyer ces données ailleurs? –
@TimBiegeleisen Peu importe à quel point le support regex est moche, quelque chose de * simple * ne sera jamais un problème dans un moteur regex. Regex est également quelque chose que vous ne voudriez certainement pas utiliser pour cette tâche. – Tomalak
@Tomalak 'SUBSTRING_INDEX' n'est pas une fonction SQL Server, c'est une fonction _MySQL_, et oui, regex est le genre de chose que vous voudriez utiliser ici. –