2012-10-27 3 views
1

모든 자식 테이블에 모든 ID가있는 하나의 마스터 테이블이 있습니다. SQL 문데이지 체인 쿼리의 조건부 쿼리

SELECT Class.Descript 
     , Regulation.Descript AS Reg 
     , Compgroup.Descript AS Grouping 
     , Category.Descript AS Cat 
     , Exempt.Descript AS Exempt 
     , Reason.Descript AS Reasons 
     , COALESCE(ComponentRuleSet.NormalType, ComponentRuleSet.Supertype, '') AS Type 
FROM  ComponentRuleSet 
LEFT OUTER JOIN Reason 
    ON ComponentRuleSet.ComponentCategoryID = Reason.ComponentCategoryID 
LEFT OUTER JOIN Class 
    ON ComponentRuleSet.ComponentClassID = Class.ComponentClassID 
LEFT OUTER JOIN Regulation 
    ON ComponentRuleSet.RegulationID = Regulation.RegulationID 
LEFT OUTER JOIN Compgroup 
    ON ComponentRuleSet.ComplianceGroupID = Compgroup.ComplianceGroupID 
LEFT OUTER JOIN Category 
    ON ComponentRuleSet.ComponentCategoryID = Category.ComponentCategoryId 
LEFT OUTER JOIN Exempt 
    ON ComponentRuleSet.ExemptID = Exempt.ComponentExemptionID 
WHERE (ComponentRuleSet.ComponentID = 38048) 

문제는 ComponentRuleSet 테이블의 두 필드 슈퍼 및 NormalType라는이 있다는 것입니다 ... 다음과 같습니다. 해당 필드 중 하나에 값이있는 경우 열에 표시해야합니다. 그러나 둘 다 값이없는 경우 열에 공백 값을 표시해야합니다. 아이디어가 있으십니까?

--- 편집

는 유착의 내 위치는 편집 된 쿼리에 맞습니까? 그것은 여전히 ​​오류를 반환하고 있습니다.

--update

중요 : 두 필드의 유형은 부울이다, 나는 진정한 가치를 보유하고있는 열의 열 이름을 반환하고 TYPE 열에서 그 값을 배치해야합니다. 이 필드

+1

_both_에 값이 있으면 어떻게할까요? – Oded

+0

하나의 유형 또는 다른 유형이어야합니다. ON/OFF 스위치 개념. 두 입력란의 값을 모두 사용할 수 없습니다. – Ccorock

+1

나는 당신이 그 질문에 언급하지 않았기 때문에 나는 많이 생각했지만 확인을 원했다. – Oded

답변

1

의견을 보면, 아마도 CASE 표현 작동합니다 :

select ... 
     , CASE WHEN ComponentRuleSet.NormalType is not null then 'NormalType' 
      WHEN ComponentRuleSet.Supertype is not null then 'SuperType' 
      ELSE '' 
      end as Type 

UPDATE 부울 값은 참 d 0가 false이면 다음을 시도하십시오.

select ... 
     , CASE WHEN ComponentRuleSet.NormalType = 1 then 'NormalType' 
      WHEN ComponentRuleSet.Supertype = 1 then 'SuperType' 
      ELSE '' 
      end as Type 
+0

NormalType이 TRUE이고 SuperType이 FALSE 인 경우 충돌이 발생하지 않습니까? SuperType은 NULL이되지 않습니다. – Ccorock

+0

두 필드의 유형은 부울입니다. – Ccorock

+1

@Ccorock - 그냥 "TRUE"를 선택하면됩니다. 두 열의 데이터 유형을 모르고 추측하고있었습니다. – BellevueBob

3

사용 COALESCE :

COALESCE(ComponentRuleSet.NormalType, ComponentRuleSet.Supertype, '') AS Type 

COALESCE :

는 인수 중 첫 번째 Null이 아닌 식을 돌려줍니다. 실제 요구 사항 등 의견을 다음


, CASE 아마 더 나은 옵션입니다 :

CASE WHEN ComponentRuleSet.NormalType = 1 THEN 'NormalType' 
    WHEN ComponentRuleSet.Supertype = 1 THEN 'SuperType' 
    ELSE '' 
END AS Type 
+0

@ 코콕 - 음. 내가 그 비트를 포함 시켰습니다 ... 나는 별칭 ('AS Type')을 사용하고 있습니다. – Oded

+0

Im afraid True 문이 들어있는 실제 열 이름이 필요합니다. 예를 들어 IF ComponentRuleSet.Supertype = True이면 Type의 값은 SuperType이됩니다. – Ccorock

+0

질문이 아닌 대답 아래에 의견과 질문을 넣어야합니다. 그렇다면'COALESCE'를 사용하여 어떤 오류가 있었습니까? 내 생각 엔 다른 칼럼 이름이 필요하다는 것이다. 'TYPE'은 예약어 일 수있다. – BellevueBob

관련 문제