1
votes

Filtrer les lignes en faisant correspondre la liste séparée par des virgules à la liste séparée par des virgules

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 commentaires

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.


3 Réponses :


3
votes

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%'


4 commentaires

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.



-1
votes

Essayez quelque chose comme ça.

SELECT *
FROM myTable
WHERE Col2 LIKE '%ABS%'
OR Col2 LIKE '%MCM%'


1 commentaires

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.



2
votes

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


0 commentaires