如何将列中的值与SQL Server中的长列表进行比较

时间:2017-10-19 15:55:18

标签: sql sql-server

假设我的表是T而我的列是C,我需要检查C中的任何子字符串是否具有以下任何值:Orange,Apple,Banana,Kiwi,Strawberry,Blueberry。

我的实际值列表超过80,我想尽量避免以下情况:

 Select * from T
 Where C LIKE '%Orange%'
 OR C LIKE '%Apple%'
 OR C LIKE '%Banana%'
 OR C LIKE '%Kiwi%'
 OR C LIKE '%Strawberry%'
 OR C LIKE '%Blueberry%'

有没有办法将我的值插入表中并将其与之进行比较?我在查询中多次进行这种比较。

1 个答案:

答案 0 :(得分:1)

这是我会使用函数将逗号分隔列表转换为表然后加入它的异常情况之一:

CREATE FUNCTION [dbo].[udf_ConvertStringArrayToTable] (
@StringArray    VARCHAR(MAX)
)

RETURNS @StringTable    TABLE
(
String  VARCHAR(500)
)

AS
BEGIN

DECLARE @Index  INT
SET @StringArray = LTRIM(RTRIM(@StringArray))
WHILE LEN(@StringArray) > 0
BEGIN

SET @Index = CHARINDEX(',', @StringArray, 1)
IF @Index = 0 BEGIN SET @Index = LEN(@StringArray) + 1 END

INSERT INTO @StringTable
SELECT SUBSTRING(@StringArray, 1, @Index - 1)

If @Index > LEN(@StringArray) BEGIN SET @StringArray = '' END
ELSE BEGIN SET @StringArray = SUBSTRING(@StringArray, @Index + 1, LEN(@StringArray) - @Index) END

END

RETURN

END

然后你可以这样称呼它:

DECLARE @Example VARCHAR(MAX)
SET @Example = 'Orange,Apple,Banana,Kiwi,Strawberry,Blueberry' -- etc

SELECT
*
FROM
udf_ConvertStringArrayToTable(@Example) E
INNER JOIN T ON T.C LIKE '%' + E.String + '%'