2017-03-13 2 views
0

IF 또는 CASE 문을 where 절에 포함시켜야합니다.이 절은 db의 데이터에 따라 레코드를 제공합니다.IF를 where 절에 포함합니다.

내가 원하는 것은 relationship_code_id에 특정 코드가있는 특정 연락처를 선택하여 POA (코드 45)가 할당되었음을 나타냅니다. 연락처에 POA가 없으면 기본 연락처 (main_contact = 1)를 표시합니다. 그러나 POA가있는 컨택은 주 컨택보다 우선합니다. 따라서 Joe Bloggs에 주 연락처가 할당되었지만 Anne Nickols가 POA를 할당 받았다면 Anne not Joe를 보여줍니다.

나는이 작업을 수행 할 수 있습니다 어쨌든 거기에 (이 정보는 TNTGROUP 테이블에 포함)?

사과하지 않으면 사과드립니다.

이 내 아래 코드입니다

SELECT 

    TNTTITLE.Description_VC AS TITLE 
    ,TNTCONTACT.Forename_VC AS FORENAME 
    ,TNTCONTACT.Surname_VC AS SURNAME 
    ,TNTCONTACTEMAIL.Reference_VC AS EMAIL 
    ,TNTHOMENUMBER_GRP.Reference_VC AS GROUP_HOME_NUMBER 
    ,RENTACC.ID AS RENT_ACCOUNT_ID 
    ,CONVERT(DATE,RENTACC.AccountStartDate) AS RENT_ACCOUNT_START_DT 
    ,CASE 
     WHEN LETOFFERS.Current_Status_ID = 42 THEN 'Complete' 
    ELSE 'OTHER' 
    END 
     AS STATUS 
    ,ASSETTYPES.Description_VC AS ASSET_NAME 
    ,CASE WHEN (SELECT MainAsset FROM RENTACC HAVING COUNT(*) > 1) THEN 1 ELSE 0 END 


    FROM RENT_ACCOUNTS AS RENTACC 

    INNER JOIN LETTING_OFFERS_T AS LETOFFERS 
     ON RENTACC.ID = LETOFFERS.Rent_Account_Reference_VC 
      AND RENTACC.AccountEndDate IS NULL 
      AND RENTACC.AccountType = 'T' 

    LEFT JOIN Letting_SYS_Master_T AS LETCODES 
     ON LETOFFERS.Current_Status_ID = LETCODES.CODE_ID 
      AND LETCODES.Type_ID = '14' 

    LEFT JOIN Asset_Assets_T AS ASSETS 
     ON RENTACC.MainAsset = ASSETS.Asset_ID 

    LEFT JOIN Asset_Types_T AS ASSETTYPES 
     ON ASSETS.Asset_TYPE_ID = ASSETTYPES.Asset_Type_ID 


    /**** MAIN CONTACT INFORMATION ****/ 

    LEFT JOIN Shared_Addresses_T AS TNTADDRESS 
     ON ASSETS.Address_ID = TNTADDRESS.Address_ID 

    LEFT JOIN Contact_Group_Contacts_T AS TNTGROUP 
     ON RENTACC.ContactDatabaseReference = TNTGROUP.GROUP_ID 
      AND TNTGROUP.Main_Group_Contact_BT = 1 
      AND TNTGROUP.Removed_BT = 0 

    LEFT JOIN CONTACT_CONTACTS_T AS TNTCONTACT 
     ON TNTGROUP.Contact_ID = TNTCONTACT.Contact_ID 
      AND TNTCONTACT.Current_Status_ID = 65 
      AND TNTCONTACT.Deceased_Date_DT IS NULL 

    LEFT JOIN Shared_Codes_T AS TNTTITLE 
     ON TNTCONTACT.Title_Code_ID = TNTTITLE.Code_ID 
      AND TNTTITLE.Code_ID IN (103,104,105,106) 

    /**** CONTACT EMAIL INFORMATION ****/ 

    LEFT JOIN Contact_Contact_Details_T AS TNTCONTACTEMAIL 
     ON TNTCONTACT.Contact_ID = TNTCONTACTEMAIL.Contact_ID 
      AND TNTCONTACTEMAIL.SYS_Number_Code_ID = 75 
      AND TNTCONTACTEMAIL.Expiry_Date_DT IS NULL 


    /**** GROUP HOME NUMBER INFORMATION ****/ 

    LEFT JOIN Contact_Group_Details_T AS TNTHOMENUMBER_GRP 
     ON RENTACC.ContactDatabaseReference = TNTHOMENUMBER_GRP.Group_ID 
      AND TNTHOMENUMBER_GRP.Expiry_Date_DT IS NULL 
      AND TNTHOMENUMBER_GRP.SYS_Number_Code_ID = 71 
+0

그것은 AND/OR 대신에 케이스의 사용에 일반적으로 더 나은/WHERE 및 조항 ON 경우. – jarlh

+0

도움이 필요한 것만 표시하도록 코드를 최소화하십시오. 읽고 이해하기가 정말로 어렵습니다. – Stephen

+0

@jarlh 그리고 내 대답으로 그 중 아무 것도 사용하지 않는 것이 더 좋습니다. D – Hogan

답변

0

내가 이런 식으로 할 것 - 나는 부분으로 POA 연락처 정보로 가입 왼쪽 것 (45)에 대한 코드 ID를 확인하는 조인 - 따라서는 것이다 코드 ID가 45가 아니면 null이됩니다. 그런 다음 COALESCE를 사용하여 필요한 값을 가져옵니다. 당신은 당신의 데이터 모델에 대한 많은 정보를 제공하지 않습니다하지만 다음과 같아야합니다

없음 IF 또는 필요 CASE -이 모든 모든 SQL 플랫폼에 최적화 된 가입에 필터에 내장되어 평가.

SELECT 
    -- blah blah blah.. current select 
    -- TNTGROUP won't be null if relationship code is 45 
    COALESCE(TNTGROUP.CONTACT_INFO,a_table.main_contact) as Contact 
FROM a_table 
LEFT JOIN TNTGROUP ON 
    -- How TNTGROUP joins to a_table (which you don't say) 
    a_table.id = TNTGROUP.id 
    -- Only if valid 
    AND TNTGROUP.relationship_code_id = 45