2012-02-09 7 views
3

SQLクエリに次のロジックを実装したい: 日付が設定されていないか、年が1970の場合は、real_dateフラグを選択して現在のデータに変更します。 real_datetrueであり、日付を変更する必要はありません。 real_dateはテーブルの実際のフィールドではなく、設定が必要なフラグです。私は簡単に私のSELECTセクションの2行を使用してこれを行うことができますIFステートメントで2つ以上の値を選択

, IF (actualDate is NULL OR YEAR(actualDate) = 1970, CURRENT_TIMESTAMP(), actualDate) as actual_date 
, IF (actualDate is NULL OR YEAR(actualDate) = 1970, null, true) as real_date 

質問 - それはそれを行うための唯一の方法ですが?本当に私は再び条件をコピーしなければならないという事実を好まない。何とか2番目の選択肢を最初のものに移動できますか?

更新:私は両方がactualDate(真または偽/ nullになります)とreal_date(それが現在の時刻バージョンまたは実際の格納された値に固定されるのいずれか)を選択する必要があります。たぶん私は何かを見逃しているかもしれませんが、COALESCEの機能がここでどう役立つのでしょうか?

更新2:ありがとうございました。それを書くための他の方法を学んだが、それらのすべては2か所で点検した。私の考えは論理的な条件を1つの場所に持つことでしたが、可能ではないようです。

+0

* 'いくつかの日付が設定されたり、それが1970年には、その後選択された年ですされていない場合は 'を'actualDate'にNULL以外の日付集合が含まれている場合は、' NULL'を返します。 1970年以降。 –

+0

あなたの道は上手く見える(ほとんど)。しかし、NULL FIRSTのテスト、実際の年... real_dateのフラグについては、私は明示的に...、true、false)をreal_dateとして返します – DRapp

+0

ありがとう、アンドリー。編集されたコード(typoだった)。 DRapp、それはなぜですか? –

答えて

1

あなたの亜種は、今後もコードをサポートするためにかなり快適です。何も変更しないでください。

1

またCASE WHEN ... THEN ... END代わりにこのここ2 IF

` チェックの(複数で)使用することができます。

1

私の代わりにこのような何か試してみてください:

… 
, COALESCE(NULLIF(actualDate, '1970-01-01'), CURRENT_TIMESTAMP()) AS actual_date 
, NULLIF(actualDate <> '1970-01-01', false) AS is_real_date 
… 

それとも二NULLIF()が本当に必要ではありませんの? 2番目の列は、その後truefalseまたはNULL可能性があり、そしてあなたがfalseと同じNULLを扱うことができ

… 
, COALESCE(NULLIF(actualDate, '1970-01-01'), CURRENT_TIMESTAMP()) AS actual_date 
, (actualDate <> '1970-01-01') AS is_real_date 
… 

:これを考えてみましょう。

1

これは私がCOALESCEを使用すると、任意の比較繰り返すことなく考えることができる最もコンパクトな形式です:

select id, type, real_date, if(real_date, actual_date, now()) as actual_date 
from (
    select *, coalesce(year(actual_date), 1970) != 1970 as real_date from table1 
) as subResult 

ワーキングexample

関連する問題