SQL: Select 行包含一个词

SQL: Select rows that contain a word

目标是select所有包含一些特定单词的行,可以在字符串的开头或结尾and/or被白色-space包围,不应该在换句话说,可以这么说。

我的数据库中有几行:

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

所以在这个例子中,select输入单词 test,应该 return 第 1、2 和 5 行。

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

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

编辑: 查询也应该 select 只包含一个词的行 test.

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

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

这应该可以解决问题。

这是你想要的吗?

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

您好,您可以使用尾随 space 和前导 space

SELECT * from new_table
where text RLIKE(' test')
union
SELECT * from new_table
where text RLIKE('test ')

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

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

Demo

使用词边界测试:

在 MySQL 8.0 之前,在 MariaDB 中:

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

MySQL 8.0:

WHERE ... REGEXP '\btest\b'

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

请注意,此解决方案也适用于标点符号,例如 "foo, test, bar"

中的逗号