繁体   English   中英

获取CASE语句以与子查询/联接一起使用

[英]Geting a CASE statement to work with subquery/join

我正在使用MySQL 5.6。

我有一个查询,查询表view_listInvoices的列state是1-7的整数,但是到目前为止大部分是NULL

我想要的是查询此状态,如果它是某些值,则显示--- ,如果是其他值, descinvoicestate在描述表中加入, descinvoicestate并显示描述。

State        Desired Value
NULL         ----
1            descinvoice.description where view_listInvoice.state = descinvoicestate.idx
2            descinvoice.description where view_listInvoice.state = descinvoicestate.idx
3            descinvoice.description where view_listInvoice.state = descinvoicestate.idx
4            ---
5            ---
6            ---
7            descinvoice.description where view_listInvoice.state = descinvoicestate.idx

descinvoicestate表是id和description列之一,仅此而已。

我目前无法查询的查询是

SELECT
otherColumns...,
(SELECT CASE WHEN `view_listInvoices`.`state` IS NULL OR `view_listInvoices`.`state` IN (4, 5, 6) THEN "---"
ELSE (SELECT `descinvoicestate`.`description` 
FROM `view_listInvoices`  
JOIN `descinvoicestate`  
ON `descinvoicestate`.`idx` = `view_listInvoices`.`state`) END) as 'Prep'

FROM `view_listInvoices`

我不断收到语法错误,但我不知道这是什么错误。 救命?

您应该使用没有嵌套的选择

SELECT
otherColumns...,
CASE WHEN `view_listInvoices`.`state` IS NULL OR `view_listInvoices`.`state` IN (4, 5, 6) 
    THEN "---"
    ELSE `descinvoicestate`.`description`
END   prep
FROM `view_listInvoices`  
JOIN `descinvoicestate`  ON `descinvoicestate`.`idx` = `view_listInvoices`.`stat

或者如果不是表之间的所有行nathc都使用左联接

SELECT
otherColumns...,
CASE WHEN `view_listInvoices`.`state` IS NULL OR `view_listInvoices`.`state` IN (4, 5, 6) 
    THEN "---"
    ELSE `descinvoicestate`.`description`
END   prep
FROM `view_listInvoices`  
LEFT JOIN `descinvoicestate`  ON `descinvoicestate`.`idx` = `view_listInvoices`.`stat

您不能以这种方式将SELECTCASE .. WHEN 另外,您可以在此处使用“相关子查询”。 请尝试以下操作:

SELECT
/* otherColumns..., */

CASE WHEN v.`state` IS NULL 
           OR v.`state` IN (4, 5, 6) 
     THEN '---' 
     ELSE ( SELECT d.description 
            FROM `descinvoicestate` AS d 
              ON d.`idx` = v.`state`
            LIMIT 1 ) 
     END as 'Prep'
FROM `view_listInvoices` AS v

我将使用LEFT JOINCOALESCE()

SELECT otherColumns...,
       COALESCE(dis.description, '---') as prep
END   prep
FROM `view_listInvoices` li LEFT JOIN
     `descinvoicestate` dis
     ON dis.`idx` = li.`stat;

这是一种相当普遍的逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM