2012-04-20 33 views
1

我正在尋找一個函數來檢查列是否具有值0,其行爲像isnull()函數。mysql - 像isnull()函數檢查零值

這是我到目前爲止有:

CONCAT(
    SUBSTRING_INDEX(
     SUBSTRING(textCol, 1, 
      LOCATE(DATE_FORMAT(dateCol,'%d.%m.%Y %H:%i'), textCol)-1), 
      '|', 
      -1),  
    SUBSTRING(
     textCol, 
     LOCATE(DATE_FORMAT(dateCol,'%d.%m.%Y %H:%i'), textCol), 
     IFNULL(
      LOCATE(/* this will return 0 if it's the last entry */ 
       '|', 
       textCol, 
       LOCATE(DATE_FORMAT(dateCol,'%d.%m.%Y %H:%i'), textCol) 
      ) - LOCATE(DATE_FORMAT(dateCol,'%d.%m.%Y %H:%i'), textCol), 
      LENGTH(textCol)))) 

在textCol的數據是有點像一個CSV文件每列內的另一個CSV文件。每個數據集由|分隔,而每個數據集由&&分隔。內部字段是名稱,日期如'%d.%m.%Y %H:%i'和評論。

我想提取對應於我在dateCol中獲得的某個DATETIME的數據集。問題是,如果我要查找的是textCol中的最後一個條目,則LOCATE(請參閱評論)返回0.但是,這打破了我的SUBSTRING,因此只返回條目的前半部分。

我加了一個ISNULL(),這當然在這裏沒有做任何事情。我想要做的是類似於ISNULL(),類似於ISZERO(),很像Perl中||運算符的行爲。

可能有一個更好的方法來實現我想要的。請不要猶豫,告訴我。

回答

3
SELECT CASE expression WHEN 0 THEN 'a substitute for zero' ELSE expression END 
FROM mytable 
+1

http://www.sqlfiddle.com/#!2/a291d/2 – Quassnoi 2012-04-20 13:19:17

+0

謝謝。這將工作。我已經想過''SELECT IF(表達式= 0,'替代零',表達式'')。不過,這兩種情況在我的情況下相當平庸。 – simbabque 2012-04-20 13:26:21

8

這是短,避免了重複表達:

SELECT COALESCE(NULLIF(expression, 0), 'a substitute for zero') FROM mytable 
+0

NULLIF是一個好主意 – 2017-06-01 02:01:49