我在那里我在页面上显示记录的情况下,我需要为用户选择的这些记录的一个子集,以显示另一页上的方式。 这些记录不会被保存在某个地方,然后,它是一个动态生成的东西。 我知道我可以使用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