带有 LIKE 运算符的 Select 语句中的 MySQL 案例

Posted

技术标签:

【中文标题】带有 LIKE 运算符的 Select 语句中的 MySQL 案例【英文标题】:MySQL Case in Select Statement with LIKE operator 【发布时间】:2011-04-04 12:46:24 【问题描述】:

是否可以在 mysql SELECT 语句中组合 CASE 语句和 LIKE 运算符?

例如,我正在尝试查询一个数据库,该数据库以两种格式中的一种格式将数据存储在单列中(这很糟糕,而且让我头疼,但我无法更改数据,所以它就是这样。)。因此,有时numbers 列的数据类似于“6901xxxxxxxx”,有时它的数据类似于“91xxxxxxxxxxx”。

我想做的是像这样查询数据-

SELECT
    CASE digits
      WHEN LIKE "6901%" THEN substr(digits,4)
      WHEN LIKE "91%" THEN substr(digits,2)
    END as "digits",
FROM raw

这显然行不通,但我希望它可能。

【问题讨论】:

【参考方案1】:

试试

SELECT
    CASE true
      WHEN digits LIKE "6901%" THEN substr(digits,4)
      WHEN digits LIKE "91%" THEN substr(digits,2)
    END as "digits",
FROM raw

【讨论】:

+1:我测试过,这行得通。 MySQL 忽略了“真”;我认为它会触发语法错误。不过,如果没有必要,我不会在其中添加“true”。【参考方案2】:

使用CASE 的第二种形式应该可以工作:

SELECT
  CASE
    WHEN digits LIKE '6901%' THEN substr(digits,4)
    WHEN digits LIKE '91%' THEN substr(digits,2)
  END as digits
FROM raw

此外,您的SELECT 末尾有一个杂散的逗号。

【讨论】:

+1: CASE column WHEN... 格式只适用于完全匹配;必须使用这种格式进行部分匹配。 叮叮叮,大小写错误。非常感谢大家,我的办公桌/前额很感激。 谢谢。语法准确 因为文档链接失效了,这里是当前的dev.mysql.com/doc/refman/8.0/en/case.html【参考方案3】:

也许使用LEFT()

SELECT
    CASE 
      WHEN LEFT(digits, 4) = '6901' THEN substr(digits,4)
      WHEN LEFT(digits, 2) = '91' THEN substr(digits,2)
    END 
FROM raw

应该比LIKE 更高效。

【讨论】:

本例中的 LIKE 只是右侧通配符,所以可以使用索引,但我不相信 LEFT/INSTR 可以使用索引。 +1 替代方案。【参考方案4】:

假设位数是恒定的,你可以使用这样的:

SELECT IF(digits > 919999, MOD(digits, 100), MOD(digits, 10000) FROM raw

添加0 以匹配您的实际位数。

【讨论】:

以上是关于带有 LIKE 运算符的 Select 语句中的 MySQL 案例的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询like语句查询

sql select where like 变量模糊查询

4.6(select 语句介绍)(简单查询)

SQL语句中关于select……like的问题

数据库之简单的sql语句

mssql中一个简单的模糊查询语句怎么写请教大侠们