【问题标题】:mySQL: Trouble with select query containing | symbol (LIKE and/or REGEXP)mySQL:选择查询包含|的问题符号(LIKE 和/或 REGEXP)
【发布时间】:2012-08-14 19:32:27
【问题描述】:

我当前的查询如下所示:

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

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

示例:

$findme = "12";

查询应该匹配:

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

查询不应该匹配:

123|32
34|123

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

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

【问题讨论】:

  • 也许是$query = "SELECT * FROM table WHERE (data='$findme') OR (data LIKE '$findme|%') OR (data LIKE '%|$findme') OR (data LIKE '%|$findme|%')"
  • 我试过了,但 "3|12|42" 仍然不匹配。 sqlfiddle.com/#!3/32afd/9

标签: mysql regex select sql-like


【解决方案1】:

使用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 分离到另一个适当规范化的一对多表中。

【讨论】:

  • 它们不会包含逗号,但这不起作用。我收到一个错误,提示“FIND_IN_SET”不是可识别的内置函数名称。 sqlfiddle.com/#!3/32afd/8
  • @compcentral 您在 MS SQL Server 2008 上设置了小提琴。FIND_IN_SET() 是 MySQL 函数。
  • 哎呀..我的错误。谢谢,这似乎可行,但是“3|12|42”条件呢?我尝试在小提琴中添加它,但出现架构错误。
  • @compcentral ??如果您在 SQL Fiddle 中遇到架构错误,您可能忘记了 ;或者其他的东西。为我工作:sqlfiddle.com/#!2/657c5/1
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
相关资源
最近更新 更多