问题如下。我有一个产品,可以是三个类别之一(由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;
答案 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来解决这个问题;您可能需要将整个联合作为子查询并且订购,但不确定,请参阅文档)
但是,您的问题似乎与表格设计存在问题
这些问题可能有效答案,但你应该知道:)