DB2 Exclude Null или установите произвольную дату - PullRequest
1 голос
/ 05 августа 2009

Мне очень трудно обрабатывать нулевые возвраты в DB2. Я попробовал IFNULL И COALESCE работает, но я все равно получаю значения в ответе.

Вот соответствующий сегмент запроса:

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

Это возвращается, но я все еще получаю нули. Есть предложения?

Ответы [ 2 ]

2 голосов
/ 05 августа 2009

Для начала я бы не объединил функцию для каждой строки, такую ​​как date(). Вам лучше проверить фактическое поле для NULL, как в следующем примере:

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;

который выводит:

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

В вашем случае код будет выглядеть примерно так:

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

Я не проверял ваш конкретный случай, так как мой 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 голосов
/ 11 августа 2009

Вы можете попробовать использовать строку *1001* в формате 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)

Но, как сказал Пакс: Даты должны храниться в базе данных как даты, а не строки . То же самое для числовых величин, как числовые типы и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...