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

Using "LIKE" in "SELECT CASE" doesn't work - mysql

我有 table 的数据。在那个 table 中有一个名为 "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'

问题是所有值 return 都没有最后 4 个字符,这种情况似乎不起作用(或者 LIKE 可能不起作用),因为所有记录都进入第一个 "WHEN" 而不是 "ELSE".

比如我原来的数据集是:

56329856721
56329856722_502
56329856723
56329856724
56329856725_633
56329856726

那么我得到的回复是:

5632985
56329856722
5632985
5632985
56329856725
5632985

我正在使用 MySQL(特别是 SQLyog)。有谁知道我的查询有什么问题?或者如何以我将获得所需结果的方式编写条件?

谢谢大家!!

这是您的 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)

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