【问题标题】:MySQL Difficult Where ClauseMySQL Difficult Where 子句
【发布时间】:2021-10-13 10:22:17
【问题描述】:

我需要帮助解决一个我可能无法用语言很好地解释的难题。

查询只需要返回代码列中所有字符都在where子句中的结果。

假设我有下表并想返回 ABC 的代码和位置。

表:

code position
ABC 100
ABCD 200
ABCDE 300
CBA 400
BCA 500
A 600
BC 700
KABC 800
CABD 900
CA 1000

预期结果:

code position
ABC 100
CBA 400
BCA 500
A 600
BC 700
CA 1000

我已经尝试了许多使用 % 和 _ 运算符的 like 变体。开始认为 MySQL 没有这个功能。有任何想法吗?我已经走到了尽头。

【问题讨论】:

  • 你看过regexp吗?不知道它的性能如何,但可能适合您的用例。函数确实取决于您的 mysql 版本。
  • @Sam020。抱歉,我也试过了,但也许我没有充分利用它。有什么想法吗?
  • 也许您可以提供一两个您尝试过的 SQL 示例?也会帮助其他响应者。

标签: mysql sql


【解决方案1】:

@Barbaros Özhan(我非常喜欢)的另一种方法是使用 REGEXP,如下所示:

SELECT
  *
FROM test
WHERE `code` REGEXP '[^ABC]' = 0;

DBFiddle

这基本上是过滤掉每个包含除“ABC”之外的任何其他字符的[代码]。虽然这是区分大小写的,但您可以向正则表达式添加选项以使其不区分大小写(以及许多其他选项)。

查看docs

【讨论】:

  • ------------>?
  • 一种方法比另一种方法有优势吗,REGEXP vs Length Replace?
  • REGEXP 方法的一个缺点可能是与其他数据库系统的兼容性。或者速度。
  • 在我的几次快速测试中,REGEXP 更快。谢谢!
【解决方案2】:

您可以使用并发 REPLACE() 函数来选择字母 A,B,Ccode 列的值中减少,然后应用 LENGTH() 函数,例如

SELECT *
  FROM t
 WHERE LENGTH(REPLACE(REPLACE(REPLACE(code,'A',''),'B',''),'C',''))=0

Demo

【讨论】:

  • 哇。你用“union all”构建表格的方式对它的工作方式有影响吗?只是想理解它。
猜你喜欢
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多