2012-10-25 3 views
0

제 프로그래밍 언어에서는이 작업을 수행 할 수 있지만 SQL 내부에서 수행하려고합니다. 따라서 프론트 엔드 코드를 방해하지 않아도됩니다.조건부 필드 선택 oracle

나는 name1, name2, name3이라는 세 개의 이름 필드가있는 테이블이 있습니다.

이 필드 중 일부 또는 전부에 임의의 값이있을 수 있습니다. 사상 최초의 필드 값을 가지고 FIRST_NAME, 사상 두 번째 필드 값이 second_name로 전환이 로 전환 -

나는 NAME3는, NAME2,

그것은 NAME1 확인합니다 것을 세 개의 필드와 같은 반환하는 쿼리를 원하는 그 다음에 third_field.

나는 first_name을 채우기위한 CASE-END 문을 쉽게 작성할 수 있지만 second_name에 대한 논리를 작성하면 점점 복잡해진다.

는 SQL :

SELECT 
    CASE 
    WHEN NAME1 IS NOT NULL 
    THEN NAME1 
    ELSE 
     CASE 
     WHEN NAME2 IS NOT NULL 
     THEN NAME2 
     ELSE 
      CASE 
      WHEN NAME3 IS NOT NULL 
      THEN NAME1 
      ELSE '' 
      END 
     END 
    END FIRST_NAME 
    FROM TABLE_NAME 

지금, 어떻게 second_name 및 third_name 처리하나요? 아니면 더 쉬운 방법입니까? 어떤 도움에 감사드립니다

..

답변

4

이 작업을 수행하는 욕망은 당신이 해결해야하는 데이터 모델에 문제가 있음을 나타내는 것 같다 그러나 당신은 잠재적으로

SELECT coalesce(name1, name2, name3) first_name, 
     (case when name1 is not null 
      then nvl(name2, name3) 
      when name2 is not null 
      then name3 
      else null 
     end) second_name, 
     (case when name1 is not null and 
        name2 is not null 
      then name3 
      else null 
     end) third_name 
    FROM your_table 

뭔가를 할 수 있습니다. 분명히 모두 동일한 데이터를 저장하는 세 개의 열이있는 경우 테이블이 올바르게 표준화되지 않았습니다. 기존 테이블과 1 : n 관계가있는 별도의 테이블에 이름을 저장하면 더 나은 데이터 모델이됩니다.

+0

당신, 선생님, 굉장합니다 !! 이 멋진 조각은 내가 필요로하는 것을 정확하게한다! 나는 당신이 테이블 구조와 물건에 대한 의미를 알고있다. 그러나 나는 수정할 수없는 너무 오래 된 레거시 시스템을 가지고있다. (프론트 엔드 코드를 다루지 않고 SQL 내부를 처리하지 않는 이유도있다.) 다시 한번 감사 드리며, 나는 당신의 대답을 두 번 이상 엄지 손가락으로 쥘 수 있었다! *행복* –