在“SELECT CASE”中使用“LIKE”不起作用 - mysql

时间:2016-07-24 12:21:39

标签: mysql case sql-like

我有一张数据表。在该表中有一个名为“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)。有谁知道我的查询有什么问题?或者如何以我得到所需结果的方式写出条件?

谢谢大家!!

1 个答案:

答案 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)

那将是我的首选解决方案。