如何从同一个表2中选择不同的条件在同一选择(Oracle存储过程)



我有一个包含 4 个库尔门的表和一个从该表中进行选择的存储过程。 DOC_ID;CUSTOMER_TYPE_ID ;CATEGORY_ID;REQUIERD_STATUS; 到目前为止,选择非常简单,通过传递 customerId 和 categoryCode 的参数,我们得到了 docId 和 requierdStatus

现在我想添加另一列"Activity_ID"(可为空)来设置活动代码,以便我们可以更具体。 例如:直到现在 custTypeId = 1 和 CategoryCode =2 给我 2 行 custTypeId = 1, DocId = 1 ,requierdStatus =3 , CategoryCode = 2 custTypeId = 1, DocId = 2 ,requierdStatus =3 , CategoryCode = 2

通过添加活动代码,我们希望像这样控制所需的状态 文档 ID = 1 ,必需状态 =3 ,类别代码 = 2,活动 ID = 空 文档 ID = 1 ,要求状态 =4 ,类别代码 = 2,活动 ID = 10

基本上,如果文档没有特定的活动代码,那么它应该按类别选择。

在我的选择中,我需要能够通过 ActivityId 选择,但是如果没有针对该条件的行,那么我想按类别获取行。 不能发生的是,我将获得两行,一行按活动,另一行按类别。

我应该只得到一行或零。

我该怎么做?

谢谢。

如果我明白你在做什么,你似乎想要:

select min(t.doc_id) keep (dense_rank first order by t.activity_id),
min(t.required_status) keep (dense_rank first order by t.activity_id)
into ... -- unless opening a ref cursor
from your_table t
where t.customer_type_id = p_customer_type_id
and (t.activity_id = p_activity_id
or (t.activity_id is null and t.category_id = p_category_id))
group by t.customer_type_id, t.category_id;

其中p_customer_type_idp_category_idp_activity_id是过程的参数。这是假设您只想回退到按类别搜索是表活动 ID 为 null,我认为这就是您所描述的。并且传递给过程的值也不会为 null;如果可以的话,那只会使它变得更加复杂。

阅读有关keep dense_rank first构造的更多信息。基本上,它是确定分组数据中的哪一行保留在结果集中。

使用您的示例数据进行快速演示(如果我解释正确...

create table your_table (doc_id number, customer_type_id number,
category_id number, required_status number, activity_id number);
insert into your_table (doc_id, customer_type_id,
category_id, required_status, activity_id)
values (1, 1, 2, 3, null);
insert into your_table (doc_id, customer_type_id,
category_id, required_status, activity_id)
values (1, 1, 2, 4, 10);

作为带有 OUT 引用游标参数的过程:

create or replace procedure your_proc (p_customer_type_id number,
p_category_id number, p_activity_id number, p_cursor out sys_refcursor) as
begin
open p_cursor for
select min(t.doc_id) keep (dense_rank first order by t.activity_id) as doc_id,
min(t.required_status) keep (dense_rank first order by t.activity_id) as required_status
from your_table t
where t.customer_type_id = p_customer_type_id
and (t.activity_id = p_activity_id
or (t.activity_id is null and t.category_id = p_category_id))
group by t.customer_type_id, t.category_id;
end your_proc;
/

然后测试它:

var rc refcursor;
begin
your_proc (p_customer_type_id => 1, p_category_id => 2,
p_activity_id => 10, p_cursor => :rc);
end;
/
PL/SQL procedure successfully completed.
print rc
DOC_ID REQUIRED_STATUS
---------- ---------------
1               4
begin
your_proc (p_customer_type_id => 1, p_category_id => 2,
p_activity_id => 42, p_cursor => :rc);
end;
/
PL/SQL procedure successfully completed.
print rc
DOC_ID REQUIRED_STATUS
---------- ---------------
1               3

在了解您的问题后,以下解决方案可能会对您有所帮助。

CREATE PROCEDURE proc_Search 
@Activity_Id INT NULL,
@CustTypeID INT ,
@CategoryCode INT
AS 
BEGIN
SELECT DOC_ID, CUSTOMER_TYPE_ID,CATEGORY_ID, REQUIERD_STATUS
FROM myTable
WHERE @Activity_ID IS NULL OR (Activity_ID = @Activity_ID)
AND CATEGORY_ID = @CategoryCode
END 

相关内容

  • 没有找到相关文章

最新更新