2014-01-23 30 views
0

所以有條件的SQL SELECT語句,我有這個表hierchical數據,和我想選擇頂層,並將其插入到一個名爲「頂級」創建可插入

欄下面有什麼數據看起來像 頂級組織稱爲頂級組織,最終所有較低級別的頂級組織都是頂級組織。

Organization | Parent Org | GParent Org | GGParent Org | Toplevel 
Top-Level | - | - | -| - | 
Food Corp | Top-Level | - | -| - | 
Taco Bell | Food Corp | Top-Level | -| - | 
Taco Bell Express | TacoBell | Food Corp | Top-Level | - | 
KFC | Food Corp | Top-Level | -| - | 
Chuck e. Cheese | Top-Level | -| - | -| 

我無法找到足夠接近的例子,可以幫助我瞭解如何做選擇有條件/插入一個字符串。

如果Parent Org = Top-Level,Org應該被選中並插入列頂層的條件。在數據庫中,如果沒有更多的父組織,頂級顯示爲父級。無論哪裏找到最高級別,都會選擇一個級別(如Food Corp,chuck e。cheese)並將其插入Toplevel列。希望不是太混亂。

這裏的select語句的半英文版:

select Org.displayName, Parent.displayName as ParentOrg_Name, GParent.displayName as gParentOrg_Name,GGParent.displayName as ggParentOrg_Name, Org.uid, Org.accountType, Org.orgType,Parent.orgType, GParent.orgType 

CASE 
      If Org.ParentOrg_Name == Top-Level, 
      then toplevelorg = Org.Displayname 
      elseif gParentOrg_Name == Top-Level, 
       then toplevelorg = ParentOrg_Name 
     elseif ggparentOrg_Name == Top-Level, 
      then toplevelorg = gParentOrg_Name 
      else toplevelorg = ggparentOrgName 

    from dbo.Organization Org 
    LEFT OUTER JOIN dbo.Organization Parent ON Org.parentOrganization_id = Parent.id 
    LEFT OUTER JOIN dbo.Organization GParent ON Parent.parentOrganization_id = GParent.id 
    LEFT OUTER JOIN dbo.Organization GGParent ON GParent.parentOrganization_id = GGParent.id 

的MySQL,PHP ......一個工作的頂層列會幫我做一個有意義的組通過,因爲我不能簡單地按父ID而不會與較低級別的orgs(他們擁有)分開頂級orgs。

尋找教一個男人釣魚的反應,包括一個解釋'如何選擇org.displayname插入列'頂層'工作在這樣的陳述?我看着這些條件陳述,並且無法理解THEN部分。請注意,我不知道是否應在頂部選擇子句中放置「select toplevel」。我期待任何迴應

回答

2

的情況下,SQL語法是從你輕輕不同,但你很接近:

CASE 
    WHEN Org.ParentOrg_Name = 'Top-Level' 
     then Org.Displayname 
    WHEN gParentOrg_Name = 'Top-Level' 
     then ParentOrg_Name 
    WHEN ggparentOrg_Name = 'Top-Level' 
     then gParentOrg_Name 
    ELSE ggparentOrgName 
END AS toplevelorg 

因此,完整的語句應該

select Org.displayName, 
     Parent.displayName as ParentOrg_Name, 
     GParent.displayName as gParentOrg_Name, 
     GGParent.displayName as ggParentOrg_Name, 
     Org.uid, 
     Org.accountType, 
     Org.orgType,Parent.orgType, 
     GParent.orgType, 
     CASE 
      WHEN Org.ParentOrg_Name = 'Top-Level' 
       then Org.Displayname 
      WHEN gParentOrg_Name = 'Top-Level' 
       then ParentOrg_Name 
      WHEN ggparentOrg_Name = 'Top-Level' 
       then gParentOrg_Name 
      ELSE ggparentOrgName 
     END AS toplevelorg 

    from dbo.Organization Org 
    LEFT OUTER JOIN dbo.Organization Parent ON Org.parentOrganization_id = Parent.id 
    LEFT OUTER JOIN dbo.Organization GParent ON Parent.parentOrganization_id = GParent.id 
    LEFT OUTER JOIN dbo.Organization GGParent ON GParent.parentOrganization_id = GGParent.id 
+0

那麼END AS會將它插入到columnname toplevelorg?超級謝謝你btw –

+0

當我結束AS頂級組織,這是否需要我改變選擇部分必須添加「,toplevelorg CASE .... END AS toplevelorg」到選擇結束,或者只是做CASE .. end as,並且將toplevelorg定義爲自己的列,而不需要將toplevelorg放兩次 –

+1

@ J-Dizzle否,'END'結束'CASE',並且'AS'與您的結構相同。 G。作爲ggParentOrg_Name已經在'GGParent.displayName'中使用,只是使用'CASE'表達式而不是列名作爲第一部分。 – FrankPl

0

弗蘭克PI的迴應大多數工作,但我得到一個錯誤,說mssql_query()(PHP)沒有識別列名ParentOrg_Name和其他列名稱。我發現這起作用,並且別名在案件陳述中不起作用。因此,聲明全文是這樣的:

select Org.displayName as Organization_Name, Parent.displayName as ParentOrg_Name, 
GParent.displayName as gParentOrg_Name,GGParent.displayName as ggParentOrg_Name, 
    Org.uid, Org.accountType, Org.orgType, 
    CASE WHEN Parent.displayName = 'Top-Level' then Org.Displayname 
     when GParent.displayName = 'Top-Level' then Parent.displayName 
     when ggParent.displayName = 'Top-Level' then gParent.displayName 
     else ggParent.displayName 
    END AS toplevelorg 
    from HQDevBox.dbo.Organization Org 
    LEFT OUTER JOIN HQDevBox.dbo.Organization Parent ON Org.parentOrganization_id = Parent.id 
    LEFT OUTER JOIN HQDevBox.dbo.Organization GParent ON Parent.parentOrganization_id = GParent.id 
    LEFT OUTER JOIN HQDevBox.dbo.Organization GGParent ON GParent.parentOrganization_id = GGParent.id 

爲了鍛鍊; Tibial學習,還有另一種可能的情況下,我可以使用CASE,因爲orgType返回一個數字,它映射到一個字符串值。所以這裏是兩個CASE的陳述(是可能的和有效的)。

select Org.displayName as Organization_Name, Parent.displayName as ParentOrg_Name, 
GParent.displayName as gParentOrg_Name,GGParent.displayName as ggParentOrg_Name, 
     CASE WHEN Parent.displayName = 'Top-Level' then Org.Displayname 
     when GParent.displayName = 'Top-Level' then Parent.displayName 
     when ggParent.displayName = 'Top-Level' then gParent.displayName 
     else ggParent.displayName 
     END AS toplevelorg, 
     Org.uid, Org.accountType, 
     CASE WHEN Org.orgType = 0 then 'Agency' 
      when Org.orgType = 1 then 'Essential' 
      when Org.orgType = 2 then 'Power' 
      when Org.orgType = 3 then 'Sub_Agency' 
      when Org.orgType = 4 then 'Sub_Organization' 
      END AS orgType 
    from HQDevBox.dbo.Organization Org 
    LEFT OUTER JOIN HQDevBox.dbo.Organization Parent ON Org.parentOrganization_id = Parent.id 
    LEFT OUTER JOIN HQDevBox.dbo.Organization GParent ON Parent.parentOrganization_id = GParent.id 
    LEFT OUTER JOIN HQDevBox.dbo.Organization GGParent ON GParent.parentOrganization_id = GGParent.id 

希望這會幫助別人。

+1

正如注:有一個簡短的形式'CASE'對你的其他案例很有用:你可以說'CASE Org.orgType'當時'當時'代理'當時1'基本'... END'。 – FrankPl