2010-04-09 72 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