MySQL WHERE 子句构造问题

标签 mysql where-clause

我用它来按 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/

相关文章:

mysql - 使用连接更新列

postgresql - 在 Postgres 中创建函数时出错

mysql - SQL 语句 where 子句按年龄组

sql-server - SQL Server : Conditional where clause (Equal) OR (LessThan or Equal)

mysql - SQL使用不同的返回重复记录

java - 如何在 jdbc 与 mysql 中提交连接后保持结果打开?

MySQL:更新触发器。如果不匹配任何行,获取 UPDATE 的 where 子句中使用的列的值?

php - Mysql - 如何从具有多个WHERE条件的另一个表更新表

mysql - 如果连接到 Azure 的 Excel 工具保存在 OneDrive 上,我的团队是否必须连接到 ODBC?

php - Codeigniter 模型多个连接语句返回最后一个语句