0

目标是选择包含某个特定单词的所有行,可以在字符串的开头或结尾和/或被空格包围,可以这么说,不应该在其他单词内。

这是我的数据库中的几行:

+---+--------------------+
| 1 | string with test   |
+---+--------------------+
| 2 | test string        |
+---+--------------------+
| 3 | testing stringtest |
+---+--------------------+
| 4 | not-a-test         |
+---+--------------------+
| 5 | test               |
+---+--------------------+

所以在这个例子中,选择 wordtest应该返回第 1、2 和 5 行。

问题是由于某种原因,SELECT * FROM ... WHERE ... RLIKE '(\s|^)test(\s|$)';返回 0 行。

我在哪里错了,也许,如何才能做得更好?

编辑: Query 还应该选择只有一个 word 的行test

我的第一个问题的答案是:
我没有转义特殊字符,所以\s应该是\\s.
工作查询:SELECT * FROM ... WHERE ... RLIKE '(\\s|^)test(\\s|$)';。(或者只是一个空格( |^)/ ( |$),也可以)

4

5 回答 5

1

REGEXP_INSTR()函数,它是函数的扩展INSTR(),可能默认用于 10.0.5+ 版本case-insensitively

SELECT *
  FROM t
 WHERE REGEXP_INSTR(str, 'TeSt ')>0
    OR REGEXP_INSTR(str, ' tESt')>0

Demo

于 2020-01-02T22:19:15.493 回答
1

嗨,您可以使用尾随空格和前导空格来抓取

SELECT * from new_table
where text RLIKE(' test')
union
SELECT * from new_table
where text RLIKE('test ')
于 2020-01-02T21:56:05.460 回答
0

SELECT * FROM ... WHERE ... LIKE 'test';

这应该可以解决问题。

于 2020-01-02T21:38:33.907 回答
0

这是你想要的吗?

   SELECT * FROM ... WHERE ... LIKE 
     '%test%'; 
于 2020-01-02T21:41:38.010 回答
0

使用单词边界测试:

在 MySQL 8.0 之前和 MariaDB 中:

WHERE ... REGEXP '[[:<:]]test[[:>:]]'

MySQL 8.0:

WHERE ... REGEXP '\btest\b'

(如果这不起作用,请将反斜杠加倍;这取决于客户端是否在 MySQL 获取反斜杠之前折叠它们。)

请注意,此解决方案也适用于标点符号,例如“foo, test, bar”中的逗号

于 2020-01-11T17:27:25.303 回答