Давайте посмотрим, как Db2 работает со значениями NULL
в GROUP BY
и INTERSECT
:
with t(a, b, clm_cmp_cd) as (values
( 1, 1, 'clm')
, ( 1, 1, 'cmp')
, (null, 1, 'clm')
, (null, 1, 'cmp')
, ( 2, 1, 'cmp')
)
select a, b
from t
where clm_cmp_cd='clm'
intersect
select a, b
from t
where clm_cmp_cd='cmp';
with t(a, b, clm_cmp_cd) as (values
( 1, 1, 'clm')
, ( 1, 1, 'cmp')
, (null, 1, 'clm')
, (null, 1, 'cmp')
, ( 2, 1, 'cmp')
)
select a, b
from t
where clm_cmp_cd in ('clm', 'cmp')
group by a, b
having count(1)>1;
Оба запроса возвращают одинаковый результат:
A B
-- --
1 1
<null> 1
NULL
эти операторы обрабатывают значения одинаково.
Если в вашей таблице слишком много столбцов, чтобы указывать их вручную в запросе, вы можете создать список столбцов со следующим запросом:
select listagg(colname, ', ')
from syscat.columns
where tabschema='MYSCHEMA' and tabname='TABLE' and colname<>'CLM_CMP_CD';