2

问题如下。我有一个产品可以属于三个类别之一(由 category_id 定义)。每个类别表都有与产品表中的 category_id 相关的 category_id 字段。所以我有3个案例。我正在检查我的 product.category_id 是否在表一中。如果是的话,我会采取一些价值观。如果没有,我会检查剩下的表格。我可以在 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;
4

6 回答 6

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
于 2010-06-16T11:43:25.757 回答
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;
于 2012-11-08T06:24:25.870 回答
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 之间的关系是什么?为什么选择它们就像它们是相同的一样(每个表/列的含义/语义是什么)?
  • 您如何保证在多个表中没有对应于一种产品的条目(并实施您可能拥有的其他业务规则)?

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

于 2010-06-16T12:00:11.583 回答
0

你可以包括这个... SELECT "Unknown type" FROM table1;

于 2010-06-16T11:38:24.567 回答
0

如果无事可做,则无需使用 ELSE。

于 2010-06-16T11:39:13.863 回答
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';
于 2010-06-16T11:40:54.937 回答