2011-03-09 147 views
7

我有一個車輛表,其中有一個Owner_ID字段。此Owner_ID將對應於Customer表中的ID字段或Business表中的ID字段。我正在尋找返回不同的值,這取決於ID所屬的表。通過CASE語句選擇多個值?

我有這樣的說法:

SELECT v.Make, v.Model 
FROM Vehicle v 
LEFT JOIN Customer c ON c.ID = v.Owner_ID 
LEFT JOIN Business b ON b.ID = v.Owner_ID 

所以說我想返回客戶的姓氏,如果Owner_ID = Customer.ID,如果Owner_ID = Business_ID的企業名稱。我知道我可以使用CASE語句,例如:

SELECT v.Make, v.Model, 
    CASE WHEN c.ID IS NOT NULL THEN c.Surname 
     WHEN b.ID IS NOT NULL THEN b.Name 

但是,有沒有辦法從一個case語句獲取多個值嗎?喜歡的東西:(我知道這是順便說完全錯誤的)

SELECT v.Make, v.Model, 
    CASE WHEN c.ID IS NOT NULL THEN 
      SELECT c.Surname, c.Date_Of_Birth 
     WHEN b.ID IS NOT NULL THEN 
      SELECT b.Name, b.Founded 

否則我將不得不這樣做:

SELECT v.Make, v.Model, 
    CASE WHEN c.ID IS NOT NULL THEN c.Surname 
     WHEN b.ID IS NOT NULL THEN b.Name 
    END AS "Name", 
    CASE WHEN c.ID IS NOT NULL THEN c.Date_Of_Birth 
     WHEN b.ID IS NOT NULL THEN b.Founded 
    END AS "DOB/Founded" 

回答

2

沒有就沒有辦法得到一個case表達的一個分支,以跨越多個列。

在您的例子情況下,你可以做

SELECT v.Make, 
     v.Model, 
     MAX(COALESCE(c.Surname, b.name)) as name 
FROM Vehicle v 
     LEFT JOIN Customer c 
     ON c.ID = v.Owner_ID 
     LEFT JOIN Business b 
     ON b.ID = v.Owner_ID 
GROUP BY v.Owner_ID 
+0

是的,我可以,但我離開了其他一些零零碎碎,使得這一個沒有去,我可以嵌套的'COALESCE'語句做到這一點,但我認爲爲了便於閱讀,我會堅持使用'CASE'。 – anothershrubery 2011-03-09 12:53:02

2

我認爲這需要明確的查詢應返回的列並這根據查詢不能改變。所以必須按每列分解條件。

IF怎麼樣?在這種情況下可能會更容易閱讀。

SELECT v.Make, v.Model, 
    IF(c.ID IS NOT NULL, c.Surname,  IF(b.ID IS NOT NULL, b.Name, NULL)) as `Name` 
    IF(c.ID IS NOT NULL, c.Date_Of_Birth, IF(b.ID IS NOT NULL, b.Founded, NULL)) as `DOB_Founded` 
0

不知道,但你可以試試這個

SELECT v.Make, v.Model 
FROM Vehicle v 
LEFT JOIN Customer c ON c.ID = v.Owner_ID 
LEFT JOIN Business b ON b.ID = v.Owner_ID 
WHERE c.Surname IS NOT NULL 
OR b.name IS NOT NULL