如何更改此sql查询

如何更改此sql查询,sql,sql-server,Sql,Sql Server,我必须更改上面的查询以执行如下结果 SELECT * FROM dbo.tbh_table WHERE TopicID IN ( SELECT value FROM dbo.fn_split('19,',') ) 我的topicID值如下15,19,12,1 但是split会给出15 19 12 1的值。因此,我无法执行查询 任何指导都会有所帮助您可以将ID添加到表变量中,然后与表变量联接,以确定表变量中是否包含TopicID SELECT * FROM dbo.tbh_tab

我必须更改上面的查询以执行如下结果

SELECT * 
FROM dbo.tbh_table 
WHERE TopicID IN (
  SELECT value 
  FROM dbo.fn_split('19,',')
)
我的topicID值如下15,19,12,1 但是split会给出15 19 12 1的值。因此,我无法执行查询


任何指导都会有所帮助

您可以将ID添加到表变量中,然后与表变量联接,以确定表变量中是否包含TopicID

SELECT * 
FROM dbo.tbh_table 
WHERE TopicID LIKE '%19,%'

假设
fn\u split
是一个表值函数(
TVF
),返回一个
表(值INT)
,使用以下方法:

DECLARE @DesiredIDs TABLE (
   DesiredID INT
)

INSERT INTO @DesiredIDs (DesiredID) Values (15)
INSERT INTO @DesiredIDs (DesiredID) Values (19)
INSERT INTO @DesiredIDs (DesiredID) Values (12)
INSERT INTO @DesiredIDs (DesiredID) Values (1)

select * from tbh_table t 
left join @DesiredIDs d on d.DesiredID = t.TopicID 
where d.DesiredID is not null

如果我没弄错你的问题,你想要这样的东西:

SELECT  t.*
FROM    dbo.tbh_table t
CROSS APPLY
        dbo.fn_split(TopicID) split
WHERE   split.value = 19

你拥有这个数据库吗?也许现在正是将其正常化并在dbo.tbh_表和Topic表之间建立链接的好时机。这样你就可以使用集合论了。正在讨论的列(dbo.tbh_table.TopicID)是一个VARCHAR吗?上面有一个相关的(但不是重复的)问题。我不知道交叉申请。这是一个特定于sqlserver的问题,对吗?如果我读对了这个问题,他的问题不是“如何匹配15或19或12或1”,而是“如果我有一个表函数来分隔字符串,如何将19匹配到一个topicId逗号分隔的字符串”。所以你的解决方案不起作用。另外,不需要DesiredDS表正是IN子句发明的目的。
SELECT * 
FROM dbo.tbh_table 
WHERE 19 IN ( 
  SELECT value 
  FROM dbo.fn_split(TopicId,',')
)