我正在尝试在逗号分隔的字符串中选择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)
它有效。有人可以请一点建议。感谢。
答案 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子句