这让我很头疼。我搜索了互联网(包括这个地方),找不到解决方案。因此,作为最后的手段,我希望这个论坛的好人能够帮助我。
我有两张桌子:
TableA
Order_detailsID
OrderID
TitleID
Return_date
TableB
TitleID
Title_name
Quantity_in_stock
并且希望运行一个显示剩余"Quantity_in_stock"的查询。
如果"Return_date"设置为NULL,则表示该项当前已过期——因此我一直在尝试对NULL值使用count()函数,并将其从"Quantity_in_stock"中减去。
这是我目前为止的脚本:
DELIMITER //
CREATE PROCEDURE InStock()
BEGIN
Select TableB.TitleID,
TableB.Title_name,
TableB.Quantity_in_stock AS 'Total_Stock',
COUNT(TableA.return_date IS NULL) AS 'Rented_Out',
TableB.Quantity_in_stock - COUNT(TableA.return_date IS NULL) AS 'Remaining Stock'
From TableB
LEFT JOIN TableA
ON TableA.TitleID = TableB.TitleID
GROUP BY TableB.TitleID;
END//
如果有一个或多个TitleID为NULL,则此操作有效。但是,如果NULL处没有值,则Count()在应该为0时仍返回值1。
我做错了什么?
代替:
COUNT(TableA.return_date IS NULL)
使用这个:
SUM(CASE
WHEN TableA.TitleID IS NULL THEN 0
WHEN TableA.return_date IS NOT NULL THEN 0
ELSE 1
END)
TableA.return_date IS NULL
谓词的问题在于,它在两种完全不同的情况下都是正确的:
- 当
TableA
中没有匹配记录时 - 当存在匹配的记录但该精确记录的
TableA.return_date
值为NULL
时
使用CASE
表达式可以区分这两种情况。
我想在这里提到一个简单的概念,当特定列为null
时,只需继续计算行数。
select count(*) from table_name where column_name is null