2013-03-28 9 views
6

Ich habe Suchanfragen, die in einem CDL kommen ("1,2,3,4"), ("1,5"). Ich muss das mit einer anderen CDL vergleichen und alle Datensätze zurückgeben, die eine Übereinstimmung haben. Der Kicker ist die Position jeder Nummer ist nicht immer gleich.Vergleichen Sie durch Komma getrennte Strings in SQL

Ich habe etwas fast funktioniert außer für Fälle, in denen ich versuche, ("2,5") zu ("2,4,5") zu entsprechen. Offensichtlich sind die Strings nicht gleich, aber ich muss diese Übereinstimmung zurückgeben, da sie alle Werte in der ersten CDL enthält.

My SQL Fiddle should make it fairly clear...

Jede Hilfe sehr geschätzt würde.

Oh, und ich sah dies one ist ähnlich, aber das scheint ein wenig drastisch und über meinen Kopf, aber ich werde sehen, ob ich versuchen kann, es zu verstehen.

bearbeiten
So habe ich nur ersetzen ("2,5") zu ("%2%5%") zu ändern und änderte die LIKE verwenden waren. Von dem, was ich am Anfang sagen kann, scheint es zu funktionieren .. SQL Fiddle Irgendeinen Grund, warum ich das nicht tun sollte oder vielleicht bin ich verrückt und es funktioniert überhaupt nicht?

+0

vielleicht wäre es einfacher, wenn Sie stattdessen einheitliche CDL erzeugen könnte (kann die Geige nicht sehen, vielleicht mein Kommentar völlig irrelevant ist). – didierc

Antwort

2

Nur noch einen Schritt weiter, bekommen Näher an deiner Antwort.
SQL FIDDLE DEMO


SELECT P.* 
FROM Product P 
CROSS APPLY(
    SELECT * 
    FROM ShelfSearch SS 
    WHERE Patindex(char(37)+replace(ss.shelflist, ',',char(37))+char(37),p.shelflist) > 0 
)Shelfs 
+0

Schön, das habe ich in meinem "Edit" gemacht. Jetzt hoffe ich nur, dass die Leistung nicht lächerlich schlecht ist. Die CSVs sollten nicht mehr als vielleicht 20 bekommen, also muss ich testen und sehen. Vielen Dank! – EmptyChair

0

Sie können die Listen in eine Tabelle mit der folgenden Funktion konvertieren:

CREATE FUNCTION DelimitedStringToTable (@cdl varchar(8000), @delimiter varchar(1)) 
RETURNS @list table (
    Token varchar(1000) 
) 
AS 
BEGIN 

DECLARE @token varchar(1000) 
DECLARE @position int 

SET @cdl = @cdl + @delimiter -- tack on delimiter to end 
SET @position = CHARINDEX(@delimiter, @cdl, 1) 
    WHILE @position > 0 
     BEGIN 
      SET @token = LEFT(@cdl, @position - 1) 
      INSERT INTO @list (Token) VALUES (@token) 
      SET @cdl = RIGHT(@cdl, DATALENGTH(@cdl) - @position)   
      SET @position = CHARINDEX(@delimiter, @cdl, 1)  
     END 
    RETURN 
END 

Dann sind Sie so etwas wie dieses können alle Spiele zu finden:

SELECT list1.* 
FROM DelimitedStringToTable('1,2,3', ',') list1 
INNER JOIN DelimitedStringToTable('2', ',') list2 ON list1.Token = list2.Token