2009-08-04 11 views
1

DB2でヌル・リターンを処理するのは非常に困難です。私はIFNULLと COALESCE関数を試しましたが、私はまだ戻り値を取得してしまいます。ここでDB2はヌルを除外または任意の日付に設定します

は、クエリの関連するセグメントである:

COALESCE (
    DATE (
     SUBSTR (DIGITS (PODATE),1,2) || char ('/') || 
     SUBSTR (DIGITS (PODATE),3,2) || char ('/') || 
     SUBSTR (DIGITS (PODATE),5,2) 
    ), 
    DATE ('12/31/99') 
) AS PODATE 

これが返されますが、私はまだヌルを取得します。助言がありますか?

+0

PODATE列の種類は? –

+0

podate列は、従来の列で作成された数値フィールドです。 –

答えて

0

ISO形式の文字列を、使用しているロケールに依存するものではなく暗黙的にPaxとして指定してみてください。このSQL文は、ロケールの日付形式の設定に関係なく、常にを処理します。他の側では

SELECT DATE('2009-04-01') 
FROM SYSIBM.SYSDUMMY1 

、解散数値フィールドに、部門剰余を使用すると、いつか素敵なトリックです。その後、数値比較を使用することができます。

SELECT 
    MOD(PODATE/10000, 100) AS YEAR, 
    MOD(PODATE/100, 100) AS MONTH, 
    MOD(PODATE, 100) AS DAY 
FROM (VALUES (991231), (090101), (null)) AS A (PODATE) 

をしかしパックスが言ったように:サンプルデータで

はパックスは、提供日付は、日付、文字列ではなくとしてデータベースに格納する必要があります。 数値型などと同じ数値です。

2

最初は、date()のような行単位の機能を統合しません。

select case when podate is null 
     then date('12/31/99') 
     else date (substr (podate,1,2) || char ('/') || 
        substr (podate,3,2) || char ('/') || 
        substr (podate,5,2) 
     end 
:、コードは次のようになり

--------- 
MYDATE 
---------- 
2009-01-01 
2009-01-02 
2009-01-03 
2000-01-01 
DSNE610I NUMBER OF ROWS DISPLAYED IS 4 

をお使いの場合:

create table a (podate varchar(8));           
insert into a (podate) values ('20090101'); 
insert into a (podate) values ('20090102'); 
insert into a (podate) values ('20090103'); 
insert into a (podate) values (null); 
commit; 
select 
    case when podate is null 
     then date('2000-01-01') 
     else date(substr(podate,1,4) || '-' || 
        substr(podate,5,2) || '-' || 
        substr(podate,7,2)) 
    end as mydate 
from a; 
drop table a; 
commit; 

出力:次の例のようにNULLのため、実際のフィールドをテストする方がいいでしょう

私のDB/2は米国の日付形式用に設定されていないため、特定のケースをテストしていません。それはまた、他にも目を引くものです。これは、米国の日付形式を使用しないプラットフォームではうまく動作しない可能性があります。

理想的には、日付は文字列ではなく日付としてデータベースに格納するのが理想です。つまり、変換コストはになります。データがテーブルに入るとになると、何百万回も出力されません。

select case when podate is null 
     then date('12/31/99') 
     else podate 
     end 

または、より良いあなたが本当の日付としてそのセンチネル日を持っているつもりはありませんしている場合、すべてでNULL秒を格納しません。そして、あなたのコードは、簡単かつ速くなります。代わりに、彼らはテーブルに行き、使用などdate('12/31/99')に変換:

select podate 

をそれは(あなたが非NULLセンチネルに慣れ仮定して)それよりもはるかに簡単またはより高速取得していません。

+0

+1 *日付は、文字列ではなく日付としてデータベースに格納する必要があります。最高のアドバイス。これまで –

+0

ありがとうございます。それは有用ですが、私はフィールドがnullで始まらない場合にはまだ問題があります。挿入前には検証されていませんがnullですが、変換時にはdate()関数によってnullが返されます。 –

関連する問題