2012-09-12 97 views
2

我有一個表的Sql Sever的查找部分字符串在另一個字符串

studentId  Classes 
1    Auto CAD,Electronics 
2    Instrumentation,Chemical,IT,English 
3    Computer,Math,Hindi 
4    Physics,Accountancy 
5    Bengali,Geography 

現在我要搜索使用單一字符串「儀器儀表,地理,物理」

它會顯示以下

studentId  Classes 
2    Instrumentation,Chemical,IT,English 
4    Physics,Accountancy 
5    Bengali,Geography 

因爲studentid 2包含儀表,studentid 4包含物理和studentid 5包含地理

如何使用SELECT聲明來執行此操作?不像'%Instrumentation%'類或類似於'%Geography%'的類或像'%Physics%'類那樣的類,因爲我想使用單個變量來將字符串「Instrumentation,Geography,Physics」或用逗號分隔的任何字符串組合在一起。

回答

2

試試這個:

SELECT * 
FROM your_Table 
WHERE ','+Classes+',' like '%,Instrumentation,%' 
OR  ','+Classes+',' like '%,Geography,%' 
OR  ','+Classes+',' like '%,Physics,%' 

我已經在搜索條件中添加了列逗號,以及這樣它會返回只用逗號

2

你可以使用T-SQL Like結束串聲明,但理想情況下,你會規範化你的數據庫,因爲你不應該在同一個字段中有多個值 - 正是出於這個原因。

問題與Like一樣,它可能會匹配不想要的術語 - 類似於%physics%也會匹配'astro-physics'課程 - 這可能不是您想要的。

在Joe的例子中 - 添加逗號會起作用(在這種情況下),但這段代碼很脆弱(真的是黑客) - 如果機會仍然存在,我的建議是normalise數據庫正確。

1

您可以將您的搜索字符串解壓縮到表變量並在存在的子句中使用。

declare @S varchar(500) 
set @S = 'Instrumentation,Geography,Physics' 

declare @T table(Class varchar(50)) 

while len(@S) > 0 
begin 
    insert into @T values(left(@S, charindex(',', @S+',')-1)) 
    set @S = stuff(@S, 1, charindex(',', @S+','), '') 
end 

select * 
from YourTable as YT 
where exists (
       select * 
       from @T as T 
       where ','+YT.Classes+',' like '%,'+T.Class+',%' 
      ) 

SQL Fiddle

相關問題