2009-11-25 68 views
1
SELECT * 
FROM dbo.tbh_table 
WHERE TopicID IN (
    SELECT value 
    FROM dbo.fn_split('19,',') 
) 

我必須要改變上述查詢執行類似下面如何改變這種sql查詢

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

我topicID值都是這樣15,19,12,1 但分裂的結果會給值15 19 12 1.因爲我無法執行查詢。

任何指導將幫助

+0

你擁有這個數據庫嗎?也許現在是正常化它的一個好時機,並且在dbo.tbh_table和Topic表之間有一個鏈接。這樣你就可以使用集合論。問題列(dbo.tbh_table.TopicID)是否爲VARCHAR? – 2009-11-25 18:19:39

+0

在http://stackoverflow.com/questions/1609657/sql-server-replacing-single-quotes-and-using-in/1609674#1609674 – Mayo 2009-11-25 18:28:52

回答

2

假設fn_split是表值函數(TVF),返回TABLE (value INT),使用此:

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

upvoted。我不知道交叉申請。這是一個特定於sqlserver的事情,對嗎? – SquareCog 2009-11-25 18:23:21

+0

正確,15個字符 – Quassnoi 2009-11-25 18:23:57

0

您可以將您的ID添加到表變量,然後用表變量加入,以確定是否TopicID是表變量。

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 
+0

有一個相關的(但不重複)的問題如果我正在閱讀的問題是正確的,他的問題不是「我如何匹配15或19或12或1」,但「我如何匹配19到topicId逗號分隔的字符串,因爲我有一個表函數來分隔字符串」。所以你的解決方案不起作用。加上不需要一個desiredIds表正是IN子句的發明。 – SquareCog 2009-11-25 18:27:56

0

如果我正確理解你的問題,你想是這樣的:

SELECT * 
FROM dbo.tbh_table 
WHERE 19 IN ( 
    SELECT value 
    FROM dbo.fn_split(TopicId,',') 
)