2013-03-31 310 views
3

我正在編寫一個查詢,其中我試圖在子查詢/ CTE中搜索通配符子字符串,並將此邏輯嵌套在CASE語句中。例如:在單個SQL語句中使用LIKE和IN以及子查詢

SELECT 
CASE 
WHEN '%' + text + '%' IN (SELECT Column1 FROM Table) THEN 'I am in Column1' 
ELSE text END 
FROM Table 

不幸的是,它看起來像沒有辦法做到這一點。因爲我需要使用LIKE運算符,並且沒有辦法同時使用LIKE和IN。我將不得不單獨編寫每個LIKE語句,並且這將用於1000多行。有沒有人推薦更直接的解決方案?提前致謝!

- 編輯:對不起,每個評論有一些說明。一個更好的例子:

UserID  | UserPeers | Gender 
-------------------------------------------- 
Mike  | Tom1, Bob1 | M 
John  | Tom1, Greg1 | M 
Sally  |Mike1, John1 | F 
Sara  | Sally1, Bob1 | F 

在上表中,我需要尋找在UserPeers列子,看他們是否在用戶名欄中任何一個地方存在。在這種情況下成功返回的行將是Sally和Sara下的行,因爲'Mike'和'Sally'存在UserID下。

SELECT * 
FROM Users 
WHERE '%' + UserPeers + '%' LIKE (SELECT UserID FROM Users) 

這裏返回的錯誤是: 子查詢返回多個值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

+1

請用一些示例數據說明。怎麼處理條件? – OldProgrammer

+0

不確定我關注。你只是想在同一行中將'text'列與'Column1'進行比較嗎? 「text」是變量還是列名? –

+0

謝謝大家的廣泛迴應,Aaron的初步答案確實有效。被卡住了。謝謝一堆! – dmedz

回答

3
SELECT UserID, CASE WHEN EXISTS 
(
    SELECT 1 FROM dbo.Users WHERE UserPeers LIKE '%' + u.UserID + '%' 
) THEN 'I am in Column1' ELSE UserID END 
FROM dbo.Users AS u; 
0

這裏有一個辦法:

SELECT (CASE WHEN exists (select 1 from table t2 where t2.column1 like '%' + t.text + '%') 
      then 'I am in Column1' 
      ELSE t.text 
     END) 
FROM Table t; 

原始查詢似乎對like錯誤的一邊通配符。

0

也許你並不真的需要LikeIN


SELECT 
CASE 
WHEN EXISTS (SELECT 1 FROM Table B WHERE B.COLUMN1 LIKE '%' + A.TEXT+ '%') THEN 'I am in Column1' 
ELSE A.text END 
FROM Table A 
+0

你是不是想要關聯子查詢? –

+0

是的,我的意思是關聯子查詢,但我不確定@thoughtExperiment是否需要key = key。 – ljh

+0

也不確定。如果我得到這些要求,我會把他們拋回去;在這種情況下,我們所能做的只是猜測。 :-) –

0

你可以嘗試這樣的事:

選擇表 情況下(SELECT COUNT(*),其中COLUMN1像(「% 「+文字+ '%'))> 0,則 '我在列1' 其他文本 結束 從表

+0

當你不關心實際的計數時,計數可能相當昂貴和浪費。 「EXISTS」保證不會更糟,但往往會好得多。 –

+0

很高興知道,謝謝。 –

相關問題