2

我正在尝试选择 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) 

有用。有人可以请教。谢谢。

4

3 回答 3

4

如果您的内部选择返回一个实际的单个字符串值,例如“19、20、21”,那么简单的使用 IN 将不起作用。您必须将其拆分为表变量(搜索所以有很多关于如何操作的选项)。

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

于 2013-08-03T03:20:31.710 回答
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, ','))
于 2013-08-03T03:49:22.773 回答
0

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

于 2013-08-03T03:46:11.213 回答