Для начала я бы не объединил функцию для каждой строки, такую как 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).