2013-08-03 92 views
2

我想选择记录其中ID存在于一个逗号分隔的字符串,但以下查询不返回任何结果:的SQL Server +选择其中逗号分隔的字符串

SELECT * FROM [SellPost] WHERE CAST([AutoId] AS nchar(100)) 
    IN (SELECT [SellPostId] FROM [SellPostViewHistory]) -- SellPostId contains the delimited string 

声明“SELECT [ SellPostId] FROM [SellPostViewHistory]”将返回19,20,21,如果我

SELECT * FROM [SellPost] WHERE CAST([AutoId] AS nchar(100)) 
    IN (19,20,21) 

更换查询它的工作原理。有人可以请建议。谢谢。

回答

4

如果你的inner select返回一个实际的单个字符串值,比如'19,20,21',简单的使用IN将不起作用。你必须把它分解成表变量(search SO there're many options on how to do it)。

然后,您可以使用此临时变量加入原始查询,也可以对此表中的SELECT运行IN语句。

0

你需要一个CSV表拆分,你可以有一个UDF以输入的字符串,并返回一个表,做一个连接这些表,并与您的从句工作

2

好可能是大多数人已经知道这一点,但还是这是解决方案之一:

创建拆分功能:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[Split](
    @delimited NVARCHAR(MAX), 
    @delimiter NVARCHAR(100) 
) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX)) 
AS 
BEGIN 
    DECLARE @xml XML 
    SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>' 

    INSERT INTO @t(val) 
    SELECT r.value('.','varchar(MAX)') as item 
    FROM @xml.nodes('/t') as records(r) 
    RETURN 
END 

用法:

DECLARE @SellPostIds nvarchar(MAX) 
    SET @SellPostIds = (SELECT [SellPostId] FROM [SellPostViewHistory]) 

    SELECT * FROM [SellPost] WHERE CAST([AutoId] AS nchar(100)) 
    IN (SELECT val FROM dbo.Split(@SellPostIds, ','))