2013-03-28 57 views
6

CDL ("1,2,3,4"),("1,5")の検索要求があります。私はそれを別のCDLと比較し、一致するすべてのレコードを返す必要があります。キッカーは各番号の位置が常に同じではありません。SQLでカンマ区切りの文字列を比較

("2,5")("2,4,5")を一致させようとしている場合を除いて、私はほとんど何かをしています。明らかに文字列は等しくないが、最初のCDLのすべての値を持つので、その文字列を返す必要がある。

My SQL Fiddle should make it fairly clear...

任意の助けもいただければ幸いです。

ああ、私はこれを見ましたoneは似ていますが、それは少し劇的で私の頭の上に見えますが、私はそれを理解しようとすることができますかどうか見てみましょう。


編集
だから、僕は交換してください("%2%5%")("2,5")を変更し、LIKEを使用していた変更することでした。私が最初に言うことができたことから、それは働いているようです。SQL Fiddle私はこれをしてはいけない、あるいは私は狂っていて、全く動作しません。

+0

あなたは(ので、多分、私のコメントは完全に無関係である、フィドルを見ることができない)の代わりに均一なCDLを生成することができれば、おそらくそれが容易になるだろう。 – didierc

答えて

2

ただ、さらに一歩をあなたの答えに近い。
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

ニース、それは基本的に私が "編集"でやったことです。今はパフォーマンスがばかげて悪くないことを願っています。 CSVは20を超えてはならないので、私はテストして見なければならないでしょう。ありがとう! – EmptyChair

0

あなたは、次の機能を持つテーブルにリストを変換することができます:

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 

その後、あなたはすべての一致を見つけるために、このようなものを使用することができます取得、

SELECT list1.* 
FROM DelimitedStringToTable('1,2,3', ',') list1 
INNER JOIN DelimitedStringToTable('2', ',') list2 ON list1.Token = list2.Token 
関連する問題