我想编写一个存储过程来选择载体,并使用一个附加参数'i_showEmptyCarrier'来指定是否需要隐藏或显示空载体。
+---------------------------+
| Carriers |
+----+----------+-----------+
| id | label | location |
+----+----------+-----------+
| 1 | carrier1 | warehouse |
+----+----------+-----------+
| 2 | carrier2 | warehouse |
+----+----------+-----------+
| 3 | carrier3 | factory |
+----+----------+-----------+
我需要查询“产品”表来检查承运人是否为空。
+-------------------------------------------+
| products |
+----+-----------+----------------+---------+
| id | carrierid | productiondate | deleted |
+----+-----------+----------------+---------+
| 1 | 1 | 09/09/2020 | 1 |
+----+-----------+----------------+---------+
| 2 | 1 | 09/09/2020 | 0 |
+----+-----------+----------------+---------+
| 3 | 1 | 09/09/2020 | 0 |
+----+-----------+----------------+---------+
| 4 | 2 | 10/09/2020 | 0 |
+----+-----------+----------------+---------+
| 5 | 2 | 10/09/2020 | 0 |
+----+-----------+----------------+---------+
因此,在这种情况下,载体3是空的。
我想要的存储过程逻辑是:
PROCEDURE GetCarriers
(
i_showEmptyCarrier IN number,
c_Carriers OUT t_cursor
)
AS
BEGIN
OPEN c_Carriers FOR
SELECT
label,
( select count(*)
from products
where products.carrierid = carriers.carrierid
and records.deleted = 0
) as nrOfProducts
FROM carriers
if(i_showEmptyCarrier == 1) {
//select carriers without a product
WHERE nrOfProducts = 0 ;
}
else{
//select carriers with a product
WHERE nrOfProducts > 0 ;
}
END GetCarriers;
因此,如果“i_showEmptyCarrier”= 1,则将选择空载波3号,
+----------+--------------+
| label | nrOfProducts |
+----------+--------------+
| carrier3 | 0 |
+----------+--------------+
否则仅选择载波1和2。
+----------+--------------+
| label | nrOfProducts |
+----------+--------------+
| carrier1 | 2 |
+----------+--------------+
| carrier2 | 2 |
+----------+--------------+
4条答案
按热度按时间t30tvxxf1#
如何修改查询以使用
left join
和conditional aggregation
,最后比较输入,af7jpaap2#
在一种情况下需要一个内部联接,在另一种情况下需要一个外部联接。因为外部联接仅仅意味着外部联接行的所有列都为空,但是,在这两种情况下,您都可以简单地进行外部联接,然后再决定是删除还是保留外部联接行。
在SQL中,这很简单:
(And当然,你可以把它聚合成
count(p.id)
。在这种情况下,您可以选择group by c.id
或查看一个载波where c.id = :carrier_id
。dphi5xsq3#
看起来你有很多Java(或其他编程语言)的影响。我不知道你到底想要什么。但这里是你如何实现你想要的。
这意味着你不需要使用if-else块来处理它。您可以在查询本身的where子句中执行此操作。
注意:我不知道你的表结构和集合细节。我猜它和张贴的代码。您可能需要相应地调整它。
xnifntxz4#
您可以创建一个存储过程,以只显示空载体或不以这种方式使用if语句和游标,你已经尝试过:
通过这种方式,您可以调用存储过程
希望它能帮助