2010-06-16 181 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;