Mysql sql select-另一个带有NULL的select仅返回NULL
我有一个类似下面的,从另一个选择中减去的。我遇到的问题是,如果第二个选择要执行减号的查询返回NULL,那么即使第一个查询有值,完整查询也会返回NULL。看起来MySQL认为1-NULL=NULL。我怎样才能解决这个问题Mysql sql select-另一个带有NULL的select仅返回NULL,mysql,sql,Mysql,Sql,我有一个类似下面的,从另一个选择中减去的。我遇到的问题是,如果第二个选择要执行减号的查询返回NULL,那么即使第一个查询有值,完整查询也会返回NULL。看起来MySQL认为1-NULL=NULL。我怎样才能解决这个问题 SELECT round(sum(iv.`amount`)) - ( SELECT round(sum(pay.`amount`)) amountSum FROM invoice iv LEFT JOIN invoiceFactoring ivf on i
SELECT round(sum(iv.`amount`)) -
(
SELECT round(sum(pay.`amount`)) amountSum
FROM invoice iv
LEFT JOIN invoiceFactoring ivf on ivf.invoiceID=iv.invoiceID
LEFT JOIN user systemuser ON (systemuser.userID=iv.ownerUserID)
LEFT JOIN Payment pay ON (pay.`invoiceID`=iv.`invoiceID`)
WHERE
(iv.invoiceStateID = 2 OR iv.invoiceStateID = 3)
AND
(ivf.`invoiceFactoringProcessID` = 7)
AND (pay.`paymentMethodID` = 1 OR pay.`paymentMethodID` = 2)
AND systemuser.`groupID` = 1
AND iv.`disabled` <> 1
AND ivf.`invoiceExpiryDate` BETWEEN date_add(now(), INTERVAL - 28 DAY) AND date_add(now(), INTERVAL - 21 DAY)
)
FROM invoice iv
LEFT JOIN invoiceFactoring ivf on ivf.invoiceID=iv.invoiceID
LEFT JOIN user systemuser ON (systemuser.userID=iv.ownerUserID)
WHERE
(iv.invoiceStateID = 2 OR iv.invoiceStateID = 3)
AND
(ivf.`invoiceFactoringProcessID` = 7 or ivf.`invoiceFactoringProcessID`)
AND systemuser.`groupID` = 1
AND iv.`disabled` <> 1 /* ta bort de som är inaktiva*/
AND ivf.`invoiceExpiryDate` BETWEEN date_add(now(), INTERVAL - 28 DAY) AND date_add(now(), INTERVAL - 21 DAY)
使用null执行任何操作都会返回null。您需要使用COALESCE或IFNULL定义如果为null,您希望发生什么。 请查看示例 看起来MySQL认为1-NULL=NULL
对,;这是正确的。一减去未知就是未知。如果希望第二个子查询的NULL被视为0,则需要将其包装在调用中:change SELECT。。。要合并选择…,0。也许可以用IFNULL包装内部sql
SELECT round(sum(iv.`amount`)) -
IFNULL((
SELECT round(sum(pay.`amount`)) amountSum
FROM invoice iv
LEFT JOIN invoiceFactoring ivf on ivf.invoiceID=iv.invoiceID
LEFT JOIN user systemuser ON (systemuser.userID=iv.ownerUserID)
LEFT JOIN Payment pay ON (pay.`invoiceID`=iv.`invoiceID`)
WHERE
(iv.invoiceStateID = 2 OR iv.invoiceStateID = 3)
AND
(ivf.`invoiceFactoringProcessID` = 7)
AND (pay.`paymentMethodID` = 1 OR pay.`paymentMethodID` = 2)
AND systemuser.`groupID` = 1
AND iv.`disabled` <> 1
AND ivf.`invoiceExpiryDate` BETWEEN date_add(now(), INTERVAL - 28 DAY)
AND date_add(now(), INTERVAL - 21 DAY)
),0)
FROM invoice iv
LEFT JOIN invoiceFactoring ivf on ivf.invoiceID=iv.invoiceID
LEFT JOIN user systemuser ON (systemuser.userID=iv.ownerUserID)
WHERE
(iv.invoiceStateID = 2 OR iv.invoiceStateID = 3)
AND
(ivf.`invoiceFactoringProcessID` = 7 or ivf.`invoiceFactoringProcessID`)
AND systemuser.`groupID` = 1
AND iv.`disabled` <> 1 /* ta bort de som är inaktiva*/
AND ivf.`invoiceExpiryDate` BETWEEN date_add(now(), INTERVAL - 28 DAY) AND date_add(now(), INTERVAL - 21 DAY)
这不仅仅是MySQL-这甚至不仅仅是SQL-这就是NULL的定义行为-句号。@Dems:看看1-0=0如何被认为是一个普遍真理,但我不认为1-NULL=NULL也是如此。相反,它是由SQL标准定义的**,由mySQL实现。**我是说随便@onedaywhen-除了NULL不是一个纯粹的SQL概念。这已经超越了它。@Dems:你对此有引用吗?使用null做任何事情都会返回null-null IS null的计算结果为TRUE。