【问题标题】:MySQL Case in Select Statement with LIKE operator带有 LIKE 运算符的 Select 语句中的 MySQL 案例
【发布时间】: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

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

【问题讨论】:

    标签: mysql case


    【解决方案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 以匹配您的实际位数。

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2018-03-08
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      相关资源
      最近更新 更多