Случай и где логика выглядит одинаково, но дает разные результаты - PullRequest
0 голосов
/ 21 мая 2018

Я получил запрос от коллеги, у которого есть оператор where, подобный следующему:

where ...
and case
    when    AOS.aircft_out_of_srvc_reason_cd in ('L','H')
         or AOS.mntnc_stn_cd in ('TLE','DWH') then 'Y'
    else 'N' end ='N'

Я подумал, что мог бы вынуть case, если я изменил его на следующий

where ...
and not (   AOS.aircft_out_of_srvc_reason_cd in ('L','H')
         or AOS.mntnc_stn_cd in ('TLE','DWH'))

но это так или иначе дает менее 10% от исходного числа записей.Мне кажется, что логика в обоих случаях одинакова.Кто-нибудь знает, почему Терадата относится к ним по-другому?

1 Ответ

0 голосов
/ 21 мая 2018

Эквивалентная логика для этого:

where ... and
     (case when AOS.aircft_out_of_srvc_reason_cd in ('L', 'H') or
                AOS.mntnc_stn_cd in ('TLE', 'DWH')
           then 'Y'
           else 'N'
      end) = 'N'

по существу:

where . . . and
      AOS.aircft_out_of_srvc_reason_cd not in ('L', 'H') and
      AOS.mntnc_stn_cd not in ('TLE', 'DWH')

(что совпадает с вашим not выражением)

Единственноепроблема в том, если оба столбца NULL, поэтому вы должны включить:

where . . . and
      ( (AOS.aircft_out_of_srvc_reason_cd not in ('L', 'H') and
         AOS.mntnc_stn_cd not in ('TLE', 'DWH') and
        ) or
        (AOS.aircft_out_of_srvc_reason_cd is null and AOS.mntnc_stn_cd is null)
      )
...