2013-03-28 19 views
6

Mam żądania wyszukiwania, które pochodzą z CDL ("1,2,3,4"), ("1,5"). Muszę to porównać z innym CDL i przywrócić wszystkie rekordy, które pasują do siebie. Kicker to pozycja, w której każda liczba nie zawsze jest taka sama.Porównywanie ciągów rozdzielanych przecinkami w SQL

Mam coś prawie działającego, z wyjątkiem przypadków, w których próbuję dopasować ("2,5") do ("2,4,5"). Oczywiście ciągi nie są równe, ale muszę zwrócić to dopasowanie, ponieważ ma wszystkie wartości w pierwszym CDL.

My SQL Fiddle should make it fairly clear...

Każda pomoc będzie mile widziane.

Och i zobaczyłem, że to one jest podobne, ale wydaje się to trochę drastyczne i ponad moją głową, ale zobaczę, czy mogę spróbować to zrozumieć.

Edit
Więc ja po prostu nie zastąpi zmienić ("2,5") do ("%2%5%") i zmienił były w użyciu LIKE. Z tego, co początkowo mogę powiedzieć, wydaje mi się, że działa. SQL Fiddle Każdy powód, dla którego nie powinienem tego robić, może jestem szalony i to w ogóle nie działa?

+0

może byłoby łatwiej, gdyby mógł wygenerować jednolitego CDL zamiast (nie widać na skrzypcach, więc może mój komentarz jest całkowicie nieistotne). – didierc

Odpowiedz

2

krok dalej, uzyskać bliżej twojej odpowiedzi.
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

Fajnie, w zasadzie to zrobiłem w mojej "Edycji". Teraz mam nadzieję, że wydajność nie jest absurdalnie zła. CSV nie powinny dostać więcej niż może 20, więc będę musiał przetestować i zobaczyć. Dzięki! – EmptyChair

0

można przekonwertować list do tabeli z następujących funkcji:

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 

Następnie można użyć coś takiego znaleźć wszystkie mecze:

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