2009-09-21 141 views
5

我有一种情况,即在页面上显示记录,并且我需要一种方式让用户选择这些记录的子集以显示在另一个页面上。这些记录不存储在任何地方,它是一个动态生成的东西。我知道我可以使用jquery传递一个逗号分隔值到我的其他网页,但我不知道什么是最好的方式在sql中说uniqueid是在这个id列表不在表中等我知道我可以动态地用一堆或多个SQL来构建SQL,但是这看起来像是一个黑客。任何人有任何建议?将列与t-sql中的值列表进行比较

+1

http://stackoverflow.com/questions/878833/ – 2009-09-21 18:58:24

回答

3

这是最好的来源:

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

创建拆分功能,使用它像:

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

I prefer the number table approach

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

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) 

一旦表中设置了数字,创建此功能:

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 
0

对于此问题,您可以使用解决方案Joel Spolsky recently gave

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

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

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问题,包括:

+0

第一提及的“装置”是在至少30岁(甚至早于SQL本身)。在当代一个人之后重新命名它似乎不合适。 – RBarryYoung 2009-09-22 05:54:11

+0

够公平的。我会重写这个句子。 – 2009-09-22 06:19:46

相关问题