我使用它来过滤LocState的记录: (状态作为管道分隔值传递,如下所示,但将是参数)
INSTR(CONCAT('|','TX|OH','|'),e.LocState) > 0
但是......我怎么能让它适合这样的事情?:
INSTR(CONCAT('|','AO|WH15','|'),e.ProgramCode) > 0
它还会导致ProgramCode ==' WH1'。
匹配POSITION(e.ProgramCode IN CONCAT('|','AO|WH15','|')) > 0
也不起作用。
答案 0 :(得分:2)
假设你有这样的数据记录:
ID ProgramCode
1 WH1
2 WH15
您想要过滤与WH1
匹配的记录。如果您使用此查询:
SELECT *
FROM table
WHERE ProgramCode INSTR(CONCAT('|','AO|WH15','|'),e.ProgramCode) > 0
你基本上是在说:
选择ProgramCode在以下字符串中的记录:
'|A0|WH15|'
由于'WH1'
在 'WH15'
中,你会得到误报。
最好使用WHERE IN
构造,如下所示:
SELECT *
FROM table
WHERE ProgramCode IN ('A0', 'WH15');
这意味着:
选择ProgramCode(完整)在以下字符串集中的记录:
'A0', 'WH15'
如果您的过滤条件作为竖线分隔的字符串传递,则需要先解析它,以便为IN
参数设置正确的数据集。
您可能也有兴趣使用regular expressions,因为MySQL支持它们。