Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CASE+IF-MysQL查询_Mysql_Case_Exists - Fatal编程技术网

CASE+IF-MysQL查询

CASE+IF-MysQL查询,mysql,case,exists,Mysql,Case,Exists,问题如下。我有一个产品,它可以属于category_id定义的三个类别之一。每个类别表都有与产品表中的category_id相关的category_id字段。所以我有3个病例。我正在检查我的product.category\u id是否在表1中。如果是,我取一些值。如果没有,我就签入剩下的表格。我可以在“其他”部分写什么?有人能纠正我的疑问吗 CASE WHEN IF EXISTS(SELECT * FROM table1 WHERE category_id='category_id')

问题如下。我有一个产品,它可以属于category_id定义的三个类别之一。每个类别表都有与产品表中的category_id相关的category_id字段。所以我有3个病例。我正在检查我的product.category\u id是否在表1中。如果是,我取一些值。如果没有,我就签入剩下的表格。我可以在“其他”部分写什么?有人能纠正我的疑问吗

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;

你可以包括这个。。。
从表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';
ELSE SELECT group_id FROM table3 WHERE category_id='category_id';
在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

除了Guffa的答案之外,这里还有另一种方法——假设@category_id是

SET @category_id = 'some_category_id_value'
然后

应该返回您要求的内容,并且性能也不错

如果您在一个以上的表中有特定的category_id,您将获得多条记录,您可以通过将结果数限制为1来获得这些记录;您可能需要将整个联合体设置为子查询并对其排序,但不确定,请查阅文档

但是,您的问题看起来好像是您的表的设计有问题

为什么保留三个类别表而不是一个? 类型\ id、值\ id和组\ id之间的关系是什么?为什么选择它们就像它们是相同的东西一样有意义?每个表/列的含义/语义是什么? 如何保证在多个表中不存在与一个产品对应的条目,并实现可能有的其他业务规则? 这些问题可能有有效的答案,但您应该知道它们:

示例

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;

或者只是文字字符串“未知类型”。但是,其他值似乎是数字,因此字符串值可能不起作用。
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;