4

列の値が0で、関数のように動作するかどうかを確認する関数を探してい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'、コメントです。

取得した特定のDATETIMEに対応するデータセットを抽出したいと思いdateColます。問題は、探しているものがの最後のエントリであるtextCol場合、LOCATE(コメントを参照)が0を返すことです。しかし、それは私の問題SUBSTRINGであるため、エントリの前半のみが返されます。

を追加しましたISNULL()が、もちろんここでは何もしません。私がやりたいのは、Perlの演算子が動作するのと同じように、ISNULL()その種の動作に似たものを用意することです。ISZERO()||

私が望むことを達成するための全体としてより良い方法があるかもしれません。遠慮なく教えてください。

4

3 に答える 3

11

これは短く、式の繰り返しを回避します。

SELECT COALESCE( NULLIF( expression, 0 ), 'a substitute for zero' ) FROM mytable
于 2015-01-02T19:33:49.513 に答える
8

ここで役立つかもしれません:式がNULLまたは0のいずれかであるかどうかをチェックするファンキーな方法があります:

IFNULL(NULLIF(expr, 0), alt_expr)

exprがNULLまたは0の場合はalt_exprを返し、それ以外の場合はexprを返します。

于 2019-03-05T21:33:37.637 に答える
2
SELECT  CASE expression WHEN 0 THEN 'a substitute for zero' ELSE expression END
FROM    mytable
于 2012-04-20T13:17:30.237 に答える