2017-11-30 8 views
1

빠른 질문행의 여러 열 값이 같은지 확인하십시오. 여기

나는 그래서 기본적으로 내가 column_1과 열 (5) 사이의 모든 colums가 같은 경우, 다음 (값으로 열을 얻을 알고 싶은이

COLUMN_1 COLUMN_2 COLUMN_3 COLUMN_4 COLUMN_5 SAME 
X1  X1  X1  X1  X1  X1 
X1  X2  X1  X1  X3  DIFFERENT 
X1  NULL  X1  X1  NULL  X1 
X1  NULL  X2  NULL  X3  DIFFERENT 

같은 테이블이 행 1). 모든 열이 다르다면 다른 열 (행 2)을 가져옵니다. 이 행은 널 값 (행 3, 행 4)을 포함 할 수 있지만 플래그에는 영향을주지 않습니다.

BTW, 열 유형은 STRING입니다.

나는 이것을 테라 데이타 또는 오라클에서 찾고 있습니다.

덕분에 많은

PS : Column_1 그것이 X5에 1 개에서 값을 포함 할 수 null이되지 않습니다. Column_2 ~ Column_5는 null 일 수 있습니다. 당신이 할 수있는 트리거를 사용하여

+0

경우는 어떻게? –

+0

column_1은 항상 x1입니까? 모든 열이 X3이면 Same = X3입니까? – born2bmild

+0

열 1이 null이 아닙니다. – gabuglc

답변

1

이 같은 : 당신은 위의 트리거뿐만 아니라 NULL 조건 검사를 추가하는 것을 고려 할 수

CREATE OR REPLACE TRIGGER TRIGGER1 
BEFORE INSERT OR UPDATE ON TEST 
FOR EACH ROW 
BEGIN 
    IF :new.COLUMN1= :new.COLUMN2 
    AND :new.COLUMN3=:new.COLUMN1 
    AND :new.COLUMN4=:new.COLUMN1 
    AND :new.COLUMN5=:new.COLUMN1  

    THEN 
    :new.same:='SAME'; 
    ELSE 
    :new.same:='DIFFERENT'; 

    END IF; 

END; 

.

0

열 1이 NOT NULL로 정의 된 경우 다음 논리를 적용 할 수 있습니다. 열 2에서 5를 연결하고 열 1의 문자열 발생을 제거합니다. 결과가 빈 문자열이면 모든 열이 동일하거나 NULL입니다. .

CASE 
    WHEN OReplace( Coalesce(COLUMN_2,'') 
       ||Coalesce(COLUMN_3,'') 
       ||Coalesce(COLUMN_4,'') 
       ||Coalesce(COLUMN_5,'') 
       ,COLUMN_1 
       ,'') = '' 
    THEN COLUMN_1 
    ELSE 'different' 
end 

편집 :

때도,이 너무 복잡했다. 훨씬 더 간단합니다 :

CASE 
    WHEN column_1 <> column_2 
    OR column_1 <> column_3 
    OR column_1 <> column_4 
    OR column_1 <> column_5 
    THEN 'different' 
    ELSE column_1 
end 
2

실제 데이터에 따라 일시적으로 데이터를 행으로 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을 허용합니다.

+0

아주 좋은 해결책! – born2bmild

0
당신은 당신의 테이블에 가상 열을 추가하는 것을 고려 할 수

: 모든 NULL입니다

alter table your_table add same as(
    case when not column_1 = all(column_2, column_3, column_4, column_5) 
     then 'DIFFERENT' 
     else column_1 
    end 
);