列比较值在T-SQL列表列比较值在T-SQL列表(comparing a column to a l

2019-05-12 07:16发布

我在那里我在页面上显示记录的情况下,我需要为用户选择的这些记录的一个子集,以显示另一页上的方式。 这些记录不会被保存在某个地方,然后,它是一个动态生成的东西。 我知道我可以使用jQuery以逗号分隔值到我的其他网页通过,但我不知道什么是SQL中的最好办法说得清UNIQUEID是id,而不是在一个表等。我的这个名单知道我可以动态地构造SQL与一群口服补液盐,但是,似乎是一个黑客。 任何人有什么建议?

Answer 1:

这是最好的来源:

http://www.sommarskog.se/arrays-in-sql.html

创建拆分功能,并使用它,如:

SELECT
    *
    FROM YourTable  y
    INNER JOIN dbo.splitFunction(@Parameter) s ON y.ID=s.Value

我更喜欢数字表方法

对于这种方法的工作,你需要做的这一次表设置:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number
    INTO Numbers
    FROM sys.objects s1
    CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)

一旦Numbers表格设置,创建此功能:

CREATE FUNCTION [dbo].[FN_ListToTable]
(
     @SplitOn  char(1)      --REQUIRED, the character to split the @List string on
    ,@List     varchar(8000)--REQUIRED, the list to split apart
)
RETURNS TABLE
AS
RETURN 
(

    ----------------
    --SINGLE QUERY-- --this will not return empty rows
    ----------------
    SELECT
        ListValue
        FROM (SELECT
                  LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
                  FROM (
                           SELECT @SplitOn + @List + @SplitOn AS List2
                       ) AS dt
                      INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                  WHERE SUBSTRING(List2, number, 1) = @SplitOn
             ) dt2
        WHERE ListValue IS NOT NULL AND ListValue!=''

);
GO 

现在,您可以为CSV字符串容易分裂成表,并加入就可以了:

select * from dbo.FN_ListToTable(',','1,2,3,,,4,5,6777,,,')

OUTPUT:

ListValue
-----------------------
1
2
3
4
5
6777

(6 row(s) affected)

你可以在一个CSV字符串传递到一个程序和过程只排在给出的ID:

SELECT
    y.*
    FROM YourTable y
        INNER JOIN dbo.FN_ListToTable(',',@GivenCSV) s ON y.ID=s.ListValue


Answer 2:

您可以使用该解决方案乔尔斯波斯基最近给了这个问题。

SELECT * FROM MyTable
WHERE ',' + 'comma,separated,list,of,words' + ','
  LIKE '%,' + MyTable.word + ',%';

该解决方案是聪明的,但是进展缓慢。 更好的解决方案是分裂逗号分隔的字符串,并且构建具有一个动态的SQL查询IN()谓词,加入查询参数占位符在值的列表中的每个元素:

SELECT * FROM MyTable
WHERE word IN ( ?, ?, ?, ?, ?, ?, ?, ? );

占位符的数量是你必须确定,当你分割你的逗号分隔的字符串。 然后从每个参数列表传递一个值

如果您在列表中的值太多,使长IN()谓词是笨重,然后插入值到一个临时表,并JOIN对你的主表:

CREATE TEMPORARY TABLE TempTableForSplitValues (word VARCHAR(20));

...split your comma-separated list and INSERT each value to a separate row...

SELECT * FROM MyTable JOIN TempTableForSplitValues USING (word);

另见SO,其中包括许多其他类似的问题:

  • 动态SQL逗号分隔值查询
  • 路过一个varchar全逗号分隔值到SQL Server IN功能
  • 参数化查询与LIKE和在
  • 参数化IN子句的SQL?


文章来源: comparing a column to a list of values in t-sql