有一種方法可以在SQL中完成,但它非常複雜。假設你可以生活在匹配一串最多三個水果名字的字符串中,你可以按照以下方式進行。
我們假設@fruits
是含有水果的清單,這是我們添加更多的逗號分隔符(如果它含有少於三個水果名)的varchar
變量:
declare @fruits varchar(80);
set @fruits = <list of fruits passed in> + ',_,_,_,';
下面的公式是不是SQL ,但子行動背後的數學,我們需要爲like
表達式:
NOTE: NOT SQL
First fruit word:
p1 = charindex(',', @fruits) << position of ',' delimiter
v1 = substring(@fruits, 0, p1-1) + '%' << fruit word we seek
r1 = substring(@fruits, p1+1) << remainder of string
Second fruit word:
p2 = charindex(',', r1)
v2 = substring(r1, 0, p2-1) + '%'
r2 = substring(r1, p2+1)
Third fruit word:
p3 = charindex(',', r2)
v3 = substring(r2, 0, p3-1) + '%'
r3 = substring(r2, p3+1)
...and so on...
現在我們替代的p1
第一的價值觀,v1
和r1
代入p2
,v2
和r2
的第二組等式。同樣,我們用第二組值代入第三組,等等。我們結束了這些怪物的v1
,v2
,並且v3
:
v1 = substring(@fruits, 0, charindex(',', @fruits)-1) + '%'
v2 = substring(substring(@fruits, charindex(',', @fruits)+1), 0, charindex(',', substring(@fruits, charindex(',', @fruits)+1))-1) + '%'
v3 = substring(substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1), 0, charindex(',', substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1))-1) + '%'
這些都是我們需要尋找前三LIKE
值:
select * from fruits
where fruit like <v1>
or fruit like <v2>
or fruit like <v3>
完全展開,查詢是:
select * from fruits
where fruit like substring(@fruits, 0, charindex(',', @fruits)-1) + '%'
or fruit like substring(substring(@fruits, charindex(',', @fruits)+1), 0, charindex(',', substring(@fruits, charindex(',', @fruits)+1))-1) + '%'
or fruit like substring(substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1), 0, charindex(',', substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1))-1) + '%'
只要我們喜歡,我們可以做更多的工作來提取第4個字,第5個字,第6個字等等。但每一個進一步的價值變得比以前更復雜。
注意:我還沒有試過這個解決方案,我只用數學證明了它。
'水果'看起來像什麼?不要說逗號分隔的值。對於關係數據庫來說,這是一個非常非常糟糕的設計。 – 2014-10-29 01:13:01
我只是用一個簡單的表格來說明。 – user3015739 2014-10-29 03:28:06
您的數據結構存在根本性問題。您不應該將事物列表存儲爲字符串。相反,你應該使用聯結表。 – 2014-10-29 10:13:49