使用LIKE运算符的MySQL选择语句中的Case

56

在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

显然这不起作用,但我希望它是可能的。

4个回答

105
使用第二种形式的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末尾有一个不必要的逗号。


2
“CASE column WHEN...” 格式仅适用于精确匹配;必须使用此格式进行部分匹配。 - OMG Ponies
2
叮咚叮咚叮咚,大小写格式错了。非常感谢大家,我的桌子/额头很感激。 - HurnsMobile
谢谢。语法准确。 - Cullen SUN
1
由于文档链接已失效,这里提供最新的链接 https://dev.mysql.com/doc/refman/8.0/en/case.html - Sascha

7

尝试

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
+1:我测试过了,这个可行。MySQL会忽略“true”;我原以为它会触发语法错误。不过,如果没有必要,我仍然不会在那里添加“true”。 - OMG Ponies

4
也许可以使用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。 - OMG Ponies

0
假设数字的数量是恒定不变的,你可以使用类似这样的代码:
SELECT IF(digits > 919999, MOD(digits, 100), MOD(digits, 10000) FROM raw

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接