실제 데이터에 따라 일시적으로 데이터를 행으로 unpivot 할 수 있으며 거기에서 문제를 쉽게 해결할 수 있습니다. 여기서 테이블에 row_id
이라는 기본 키가 있다고 가정합니다.
귀하의 예제 데이터를 사용하여 ... 아래처럼 UNPIVOT 연산자를 사용
with your_table as(
select 1 as row_id, 'X1' as c1, 'X1' as c2, 'X1' as c3, 'X1' as c4, 'X1' as c5 from dual union all
select 2 as row_id, 'X1' as c1, 'X2' as c2, 'X1' as c3, 'X1' as c4, 'X3' as c5 from dual union all
select 3 as row_id, 'X1' as c1, null as c2, 'X1' as c3, 'X1' as c4, null as c5 from dual union all
select 4 as row_id, 'X1' as c1, null as c2, 'X2' as c3, null as c4, 'X3' as c5 from dual
)
select *
from your_table;
ROW_ID C1 C2 C3 C4 C5
------ -- -- -- -- --
1 X1 X1 X1 X1 X1
2 X1 X2 X1 X1 X3
3 X1 X1 X1
4 X1 X2 X3
는 각각 자신의 기록에 모든 null이 아닌 열 값을 설정합니다. 출력에서 Null 값이 누락 된 것에 주목하십시오.
select *
from your_table unpivot(colval for colname in(c1, c2, c3, c4, c5));
row_id colname colval
------ ------- ------
1 C1 X1
1 C2 X1
1 C3 X1
1 C4 X1
1 C5 X1
2 C1 X1
2 C2 X2
2 C3 X1
2 C4 X1
2 C5 X3
3 C1 X1
3 C3 X1
3 C4 X1
4 C1 X1
4 C3 X2
4 C5 X3
... 여기에서 문제를 쉽게 해결할 수 있습니다.
select row_id
,case when count(distinct colval) = 1 -- There is only one value across columns
then min(colval) -- All are same, just pick one
else 'DIFFERENT'
end one_value
from your_table unpivot (colval for colname in(c1, c2, c3, c4, c5))
group -- Group by to reassemble the record
by row_id
편집 : C1 및 Null 허용 여부에 대한 해명 후 가, 문제가 훨씬 간단합니다 : 그것은 문제가 해결 때문에,
select case when not c1 = all(c2,c3,c4,c5) then 'DIFFERENT' else c1 end
from your_table;
하지만 어쨌든 이전 대답을 떠날거야 때 모든 열 Null을 허용합니다.
경우는 어떻게? –
column_1은 항상 x1입니까? 모든 열이 X3이면 Same = X3입니까? – born2bmild
열 1이 null이 아닙니다. – gabuglc