SQL Server +选择WHERE IN逗号分隔的字符串

时间:2013-08-03 03:06:00

标签: sql-server

我正在尝试在逗号分隔的字符串中选择Id所在的记录,但下面的查询不会返回任何结果:

  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) 

它有效。有人可以请一点建议。感谢。

3 个答案:

答案 0 :(得分:4)

如果你的内部选择返回一个实际的单个字符串值,比如'19,20,21',那么简单使用IN将不起作用。您必须将其拆分为表变量(search SO there're many options on how to do it)。

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

答案 1 :(得分: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, ','))

答案 2 :(得分:0)

你需要一个CSV到表拆分,你可以让UDF将输入作为字符串并返回一个表,对这些表进行连接并使用你的IN子句