2010-06-16 88 views
2

問題如下。我有一個產品可以在三個類別之一(由category_id定義)。每個類別表都有與產品表中的category_id相關的category_id字段。所以我有3個案例。我正在檢查如果我的product.category_id在表1中。如果是,我會採取一些價值觀。如果沒有,我檢查剩下的表格。我可以寫什麼在ELSE部分?任何人都能糾正我的查詢?CASE + IF MysQL查詢

CASE 
    WHEN IF EXISTS(SELECT * FROM table1 WHERE category_id='category_id') THEN SELECT type_id FROM table1 WHERE category_id='category_id'; 
    WHEN IF EXISTS(SELECT * FROM table2 WHERE category_id='category_id') THEN SELECT value_id FROM table2 WHERE category_id='category_id'; 
    WHEN IF EXISTS(SELECT * FROM table3 WHERE category_id='category_id') THEN SELECT group_id FROM table3 WHERE category_id='category_id'; 
ELSE "dont know what here"; 
END; 

回答

0

您可能會包含此... SELECT「Unknown type」FROM table1;

+0

或者說僅僅是文本字符串「未知類型」。但是,其他值似乎是數字,因此字符串值可能不起作用。 – Guffa 2010-06-16 12:00:20

0

如果沒有什麼可做的事情,則不需要使用ELSE。

0

或像這樣

CASE 
    WHEN IF EXISTS(SELECT * FROM table1 WHERE category_id='category_id') THEN SELECT type_id FROM table1 WHERE category_id='category_id'; 
    WHEN IF EXISTS(SELECT * FROM table2 WHERE category_id='category_id') THEN SELECT value_id FROM table2 WHERE category_id='category_id'; 
ELSE SELECT group_id FROM table3 WHERE category_id='category_id'; 
2

else你會把任何你想要作爲默認值,例如null

我認爲在結果中爲每個產品做三個左連接而不是幾個子查詢會更有效率,並使用​​3210來獲得第一個現有值。例如:

select coalesce(t1.type_id, t2.value_id, t3.group_id) 
from product p 
left join table1 t1 on t1.category_id = p.category_id 
left join table2 t2 on t2.category_id = p.category_id 
left join table3 t3 on t3.category_id = p.category_id 
+0

+1,我的建議也是如此。 – 2010-06-16 11:44:20

+0

+1,打我吧:)會給另一個版本... – Unreason 2010-06-16 11:50:29

0

除了Guffa的答案這裏是另一種方法 - 假設@category_id是

SET @category_id = 'some_category_id_value' 

然後

SELECT t1.type_id 
WHERE category_id = @category_id 
UNION ALL 
SELECT t2.value_id 
WHERE category_id = @category_id 
UNION ALL 
SELECT t3.group_id 
WHERE category_id = @category_id 

應該回到你問什麼(和性能並不差其一)。

如果您在多個表中有一定的category_id,您將獲得多條記錄(您可以通過將結果數限制爲1來解決這個問題;您可能需要將整個聯合設爲子查詢並對其進行排序,但不知道,請查閱文檔)

然而,你的問題看起來你有一個問題,你的表的設計

  • 你爲什麼要保留三個類別表,而不是一個?
  • type_id,value_id和group_id之間的關係是什麼,爲什麼選擇它們就好像它們是相同的東西(每個表/列的含義/語義)是什麼意思?
  • 您如何保證您沒有與多個產品對應的多個表中的條目(並實現您可能具有的其他業務規則)?

這些問題可以有有效的答案,但你應該知道他們:)

1

例如

SELECT CompanyName, 
    Fax, 
    CASE WHEN IF(Fax='', 'No Fax', 'Got Fax')='No Fax' THEN NULL 
     ELSE IF(Fax='', 'No Fax', 'Got Fax') 
    END AS Note 
FROM Customers;