mySQL:包含|的选择查询出现问题符号(LIKE和/或REGEXP)

时间:2012-08-18 18:37:03

标签: mysql regex select sql-like

我当前的查询如下所示:

$query = "SELECT * FROM t WHERE (data LIKE '$findme') OR (data LIKE '%$findme|%') OR (data LIKE '%|$findme%')";

此列中的数据包含由管道符号(“|”)分隔的项目,我需要查询以查找包含此字段中任何项目出现的所有记录。此外,如果此列中只有一个项目,则不会有“|”符号存在。

实施例

$findme = "12";

QUERY SHOULD MATCH:

13|23|12
12
12|23
3|12|42

QUERY SHYULD NOT MATCH:

123|32
34|123

我不确定使用REGEXP是否会使这更容易,但如果是这样,任何解决方案都是受欢迎的。谢谢!

SQLFiddle示例: http://sqlfiddle.com/#!3/32afd/5

1 个答案:

答案 0 :(得分:3)

使用REPLACE()FIND_IN_SET()的组合,您可以用逗号替换|,并在竖线分隔的集合中找到您的值$findme

SELECT * 
FROM table
/* Replace | with , and search in the set */
WHERE FIND_IN_SET('$find_me', REPLACE(data, '|', ',')) > 0

请注意,仅当data中的分隔值不包含逗号时,此方法才有效。

从长远来看,对此的适当解决方案是将分隔列data分离为另一个正确规范化的一对多表。