带有 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 案例的主要内容,如果未能解决你的问题,请参考以下文章