我用它来按 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
也不起作用。
最佳答案
假设您有这样的数据记录:
ID ProgramCode
1 WH1
2 WH15
并且您想要过滤与 WH1
匹配的记录。如果您使用此查询:
SELECT *
FROM table
WHERE ProgramCode INSTR(CONCAT('|','AO|WH15','|'),e.ProgramCode) > 0
你实质上是在说:
Select records where ProgramCode is in the following string:
'|A0|WH15|'
由于 'WH1'
位于 'WH15'
中,因此您会得到误报。
您最好使用 WHERE IN
构造,如下所示:
SELECT *
FROM table
WHERE ProgramCode IN ('A0', 'WH15');
这意味着:
Select records where ProgramCode (in its entirety) is in the following set of strings:
'A0', 'WH15'
如果您的过滤条件作为管道分隔字符串传递,则需要首先解析它,以便为 IN
参数设置正确的数据集。
您可能还有兴趣使用 regular expressions因为 MySQL 支持它们。
关于MySQL WHERE 子句构造问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401632/