我有一张数据表。在该表中有一个名为“TypeTag”的列,可以是11位数字或11位数字“_”,后跟3个数字。含义:'XXXXXXXXXXX'或'XXXXXXXXXXX_XXX'。
我只需要第一部分 - 所以我写了一个查询:
SELECT
(CASE
WHEN TypeTag LIKE '%_%' THEN LEFT(TypeTag, LENGTH(TypeTag) - 4)
ELSE TypeTag
END)
FROM `DailyReport`
WHERE DATE>='2016-07-01'
问题是所有值都返回而没有最后4个字符,这种情况似乎不起作用(或者LIKE不起作用)因为所有记录都进入第一个“WHEN”而不是“ ELSE”。
例如,如果我的原始数据集是:
56329856721
56329856722_502
56329856723
56329856724
56329856725_633
56329856726
然后我得到的回应是:
5632985
56329856722
5632985
5632985
56329856725
5632985
我正在使用MySQL(特别是SQLyog)。有谁知道我的查询有什么问题?或者如何以我得到所需结果的方式写出条件?
谢谢大家!!
答案 0 :(得分:5)
这是您的CASE
声明:
(CASE WHEN TypeTag LIKE '%_%' THEN LEFT(TypeTag, LENGTH(TypeTag) - 4)
ELSE TypeTag
END)
您忘记了_
是一个通配符(只与一个字符匹配)。因此,LIKE
正在检查该值是否至少包含一个字符。
你可以逃脱它:
(CASE WHEN TypeTag LIKE '%\_%' THEN LEFT(TypeTag, LENGTH(TypeTag) - 4)
ELSE TypeTag
END)
或者,如果你不喜欢\
作为转义字符,你可以自己定义:
(CASE WHEN TypeTag LIKE '%!_%' ESCAPE '!' THEN LEFT(TypeTag, LENGTH(TypeTag) - 4)
ELSE TypeTag
END)
或者,您可以使用SUBSTRING_INDEX()
:
SUBSTRING_INDEX(TypeTag, '_', 1)
那将是我的首选解决方案。