J'ai le tableau ci-dessous
Col1 Col2 1 ACA,ABS,PHR 2 MCM
Maintenant, je veux filtrer les données à partir de cela, donc si j'ai un paramètre de filtre comme par exemple 'ABS, MCM'
I veulent obtenir uniquement les lignes qui ont au moins un code correspondant. Donc, dans ce cas, je devrais obtenir le résultat filtré comme
Col1 Col2 1 ACA,ABS,PHR 2 PHR 3 MCM 4 ABC
Maintenant, je peux utiliser la requête Select * from myTable où Col2 in ('ABS', 'MCM' )
mais il ne récupérera pas la première ligne ACA, ABS, PHR
. Quelqu'un peut-il me dire comment je peux faire une recherche de texte pour les codes afin que tant qu'un code correspond à Col2, j'obtiens la ligne afin que je puisse passer directement la liste délimitée et tant qu'elle trouve une seule correspondance, la ligne est récupéré.
Merci
3 Réponses :
Vous pouvez simplement utiliser l'opérateur LIKE, comme suit:
SELECT * FROM mytable t WHERE EXISTS ( SELECT 1 FROM (SELECT val FROM STRING_SPLIT('ABS, MCM', ',')) x WHERE CONCAT(',', t.Col1, ',') LIKE CONCAT('%,', x.val, ',%') )
Si vous cherchez à accepter une valeur séparée par des virgules comme entrée pour la recherche, vous pouvez utiliser STRING_SPLIT ( ) (disponible depuis SQL Server 2016):
SELECT * FROM mytable WHERE Col2 LIKE '%ABS%' OR Col2 LIKE '%MCM%'
Désolé, j'aurais dû le mentionner dans ma question .. Comme je sais, cela fonctionnerait, mais j'étais curieux de savoir comment je pouvais simplement utiliser le paramètre séparé directement
@ user1221989: ok, permettez-moi d'affiner ma réponse alors
STRING_SPLIT
a été ajouté au serveur SQL 2016
@forpas: à droite ... Je n'ai pas fait attention à la balise sql server-2012. Je viens de mettre à jour ma réponse pour mentionner 2016.
Essayez quelque chose comme ça.
SELECT * FROM myTable WHERE Col2 LIKE '%ABS%' OR Col2 LIKE '%MCM%'
Pourquoi n'avez-vous pas fait cela en utilisant une procédure qui prend une chaîne délimitée par des virgules et correspond à chaque chaîne et renvoie tous les résultats correspondants, en utilisant une boucle et / ou une union.
Vous pouvez utiliser l'opérateur like
pour concat (',', col2, ',')
:
select * from tablename where concat(',', col2, ',') like '%,ABS,%' or concat(',', col2, ',') like '%,MCM,%'
Donc ', ACA, ABS, PHR,' like '%, ABS,%'
renvoie true
Un autre excellent exemple illustrant pourquoi les données doivent être conservées dans un troisième ordre. Chaque colonne du tableau 1 doit avoir une valeur.
Si vous ne pouvez pas réparer votre table, qu'en est-il d'accepter une table définie par l'utilisateur comme paramètre? Vous pouvez ensuite joindre l'UDT à la table sur Col2 comme UDT.col + '%'. Le dernier itinéraire serait de diviser la chaîne en une table, puis de faire la jointure.
Ce n'est pas une mauvaise idée ... Je pourrais le faire.