2010-04-09 47 views
1

這是與答案SQL placeholder in WHERE IN issue, inserted strings fail使用CSV的SQL INSTR()。需要精確匹配,而不是部分

快速背景跟進的問題:我們有一個使用的佔位符值接受一個字符串,它是一個獨特的標籤/ ID的SQL查詢。通常,這只是一個標籤,但我們需要爲多個標籤使用csv字符串,並返回組合結果。

在我們從供應商處獲得答案,他們建議使用INSTR功能,鼻翼:

select * 
from pitotal 
where tag IN (SELECT tag from pipoint WHERE INSTR(?, tag) <> 0) and time between 'y' and 't' 

這工作的時間非常清楚99%,問題是當tag也是CSV字符串的2部分的子集。例如,佔位符值是:'northdom,southdom,eastdom,westdom'

和可能的標籤包括: northnorthdom

會發生什麼,因爲northnorthdom一個子集,是兩個標籤的回報,而不是僅僅northdom,這實際上是我們想要什麼。

我在SQL上不夠強大,所以我無法弄清楚如何將它設置爲精確或分割csv字符串,所以我將不勝感激。

有沒有辦法分割csv字符串或使它看起來完全匹配?

回答

2

如果您使用這樣的查詢它應該工作。假設你用逗號包圍標籤。

select * 
from pitotal 
where tag IN (SELECT tag from pipoint WHERE INSTR(?, ',' || tag || ',') <> 0) and time between 'y' and 't' 

基本上...而不是搜索north我們將尋找,north,。而不是在northdom,southdom,eastdom,westdom搜索,我們將搜索,northdom,southdom,eastdom,westdom,

+0

+1,正是我在想什麼! – 2010-04-09 12:34:42

+0

+1,我們最終使用了一個小小的變化,主要是因爲我們的SQL不支持||。 (出於某種原因)。我們最終使用了'INSTR(','+?+',',','+ tag +',')'這似乎完全按照計劃工作。謝謝! – 2010-04-13 04:02:14