2017-03-13 55 views
0

我需要在where子句中包含一个IF或CASE语句,这将为我提供一个依赖于db中数据的记录。在where子句中包含IF

我想要做的是选择在relationship_code_id中具有特定代码的某个联系人,以指示他们已被分配POA(代码为45)。如果联系人没有POA,则显示主要联系人(main_contact = 1)。但是,任何具有POA的联系人都优先于主要联系人。所以如果Joe Bloggs被分配了主要联系人,但Anne Nickols被分配了POA,这个节目Anne不是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

它通常是更好地使用和/或替代情况/如果WHERE和ON子句。 – jarlh

+0

可以请您最小化您的代码,只向我们展示您需要帮助的内容。真的很难阅读和理解101加入 – Stephen

+0

@jarlh,甚至最好不要使用他们中的任何一个作为我的回答:D – Hogan

回答

0

我会做这样的 - 我会离开加入到POA联系信息的一部分加入检查码ID为45 - 因此它会如果代码ID不是45,则为空。然后我只用COALESCE来提取所需的值。你不给了很多有关你的数据模型,但它应该是这样的:

没有IFCASE需要 - 这一切都是建立在过滤器上加入的所有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