2016-07-24 48 views
2

我有一張數據表。在該表中有一個名爲「TypeTag」的列,可以是11位數字或11位數字「_」,後跟3位數字。含義:'XXXXXXXXXXX'或'XXXXXXXXXXX_XXX'。使用「SELECT CASE」中的「LIKE」不起作用 - mysql

我只需要第一部分 - 所以我寫了一個查詢:

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

我不明白這裏的案例陳述的必要性。從...中選擇左邊(TypeTag,11)有什麼問題? –

回答

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) 

這將是我的首選ed解決方案。

+0

我不能相信在我所有的搜索中,我沒有找到「SUBSTRING_INDEX」函數 - 謝謝!!!! – Bramat