woensdag 13 april 2016

SQL regular expressies

met een regulare expressie kan je records er uit filteren die bijv een ongeldig datum format hebben


select EINDDATUM_ZORG_ZV,
case
when regexp_like(EINDDATUM_ZORG_ZV,'(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d')
then 'valid'
else 'invalid' end validd
from DWH_STG_ZRM.STG_ZRM_OWH_EXPORT_2015TOTAAL where einddatum_zorg_zv is not null;


check YYYYMMDD
'(19|20)\d\d(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])'

check YYYY-MM-DD of / of .
'(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])'




SELECT * FROM (
select distinct TO_DATE( EINDDATUM_ZORG_ZV, 'yyyymmdd'),
        case when TO_DATE( EINDDATUM_ZORG_ZV, 'yyyymmdd') is null OR TO_DATE( EINDDATUM_ZORG_ZV, 'yyyymmdd') > DM_ZRM_ADMIN.GEEFGEWENSTEDATUM('OHW_MAANDSTAND_FICTIEVE_EINDDATUM')-1
             then to_char('J')
             else to_char('N') 
        end  FCT_EINDDATUM_IS_FICTIEF
from DWH_STG_ZRM.STG_ZRM_OWH_EXPORT_2015TOTAAL  WHERE BSN <> 'BSN'  and not regexp_like (EINDDATUM_ZORG_ZV,'(19|20)\d\d(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])')
) WHERE FCT_EINDDATUM_IS_FICTIEF= 'J';