CASE + IF MysQL查询

时间:2010-06-16 11:32:38

标签: mysql case exists

问题如下。我有一个产品,可以是三个类别之一(由category_id定义)。每个类别表都具有与product表中的category_id相关的category_id字段。所以我有3个案例。我正在检查我的product.category_id是否在表1中。如果是,我会采取一些价值观。如果没有,我会检查剩下的表格。我可以在ELSE部分写什么?任何人都可以更正我的查询吗?

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;

6 个答案:

答案 0 :(得分:2)

else中,您可以将任意内容作为默认值,例如null

我认为在结果中为每个产品制作三个左连接而不是几个子查询会更有效,并使用coalesce来获取第一个现有值。例如:

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

答案 1 :(得分: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;

答案 2 :(得分:0)

你可以包含这个...... 选择“未知类型”FROM table1;

答案 3 :(得分:0)

如果没有什么可以做的话,你不需要使用ELSE。

答案 4 :(得分: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';

答案 5 :(得分: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之间的关系是什么?为什么选择它们就像它们是同一个东西一样有意义(每个表/列的含义/语义是什么)?
  • 您如何保证多个表中没有与一个产品对应的条目(并实现您可能拥有的其他业务规则)?

这些问题可能有效答案,但你应该知道:)