2012-04-20 4 views
1

私は、カラムがisnull()関数のように動作する値0を持つかどうかをチェックする関数を探しています。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

+0

ありがとうございました。それはうまくいくでしょう。私はすでに '' SELECT IF(式= 0、 '0の代わりに、式) ''について考えました。しかし、どちらのケースも私の場合はむしろです。 – simbabque

8

これは短く、表現を繰り返し回避:

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

NULLIFは素晴らしいアイデアです –

関連する問題