6

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

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

私のSQLフィドルはそれをかなり明確にするはずです...

どんな助けでも大歓迎です。

ああ、私はこれが似ているのを見ましたが、それは少し抜本的で私の頭の上にあるようですが、私はそれを理解しようとすることができるかどうか見ていきます.

編集
だから私はちょうどに変更するために置き換えを行い、使用するものを変更("2,5")("%2%5%")ましたLIKE。私が最初に言うことができることから、それは機能しているようです.. SQL Fiddleこれを行うべきではない理由はありますか、それとも私が頭がおかしくてまったく機能しないのですか?

4

2 に答える 2

2

もう一歩、あなたの答えに近づきましょう。
SQL フィドルのデモ


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
于 2013-03-29T01:57:10.303 に答える
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
于 2013-03-28T22:55:39.417 に答える