SQL INSTR()使用CSV。需要精确匹配而不是部分匹配

时间:2010-04-09 02:04:25

标签: sql

这是与SQL placeholder in WHERE IN issue, inserted strings fail

的答案相关的后续问题

快速背景:我们有一个SQL查询,它使用占位符值来接受字符串,该字符串表示唯一标记/ ID。通常,这只是一个标记,但我们需要能够将csv字符串用于多个标记,并返回合并结果。

在我们从供应商处收到的答复中,他们建议使用INSTR函数,ala:

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字符串或让它找到完全匹配?

1 个答案:

答案 0 :(得分: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,