区切られた文字列を取り、テーブルを返すテーブル値関数 (2005 を使用しています) を作成することで、これを解決しました。その後、それに参加するか、WHERE EXISTS または WHERE x IN を使用できます。まだ完全なストレス テストは行っていませんが、使用が制限され、項目の数がかなり少ないため、パフォーマンスは問題ないと思います。
以下は、出発点としての機能の 1 つです。また、ルックアップ テーブルなどの ID 値の INT の区切られたリストを具体的に受け入れるように作成したものもあります。
もう 1 つの可能性は、デリミタで LIKE を使用して部分一致が無視されるようにすることですが、それではインデックスを使用できないため、大きなテーブルではパフォーマンスが低下します。例えば:
SELECT
my_column
FROM
My_Table
WHERE
@my_string LIKE '%|' + my_column + '|%'
.
/*
Name: GetTableFromStringList
Description: Returns a table of values extracted from a delimited list
Parameters:
@StringList - A delimited list of strings
@Delimiter - The delimiter used in the delimited list
History:
Date Name Comments
---------- ------------- ----------------------------------------------------
2008-12-03 T. Hummel Initial Creation
*/
CREATE FUNCTION dbo.GetTableFromStringList
(
@StringList VARCHAR(1000),
@Delimiter CHAR(1) = ','
)
RETURNS @Results TABLE
(
String VARCHAR(1000) NOT NULL
)
AS
BEGIN
DECLARE
@string VARCHAR(1000),
@position SMALLINT
SET @StringList = LTRIM(RTRIM(@StringList)) + @Delimiter
SET @position = CHARINDEX(@Delimiter, @StringList)
WHILE (@position > 0)
BEGIN
SET @string = LTRIM(RTRIM(LEFT(@StringList, @position - 1)))
IF (@string <> '')
BEGIN
INSERT INTO @Results (String) VALUES (@string)
END
SET @StringList = RIGHT(@StringList, LEN(@StringList) - @position)
SET @position = CHARINDEX(@Delimiter, @StringList, 1)
END
RETURN
END