[英]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
您不能以这种方式将SELECT
与CASE .. 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 JOIN
和COALESCE()
:
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.