gpt4 book ai didi

oracle - 如何在 select 语句返回未找到数据时返回 Null

转载 作者:行者123 更新时间:2023-12-02 00:47:29 25 4
gpt4 key购买 nike

我有这三个选择语句,我试图将 null 返回给变量 vCLASS1_IDvCLASS2_IDvCLASS3_ID当找不到数据时。

  SELECT MAX (CLASS1_ID), MAX(CLASS1_DESC)
INTO vCLASS1_ID, vCLASS1_DESC
FROM PRODUCT_CLASSIFICATION
WHERE CLASS1_DESC = P_CLASS1_DESC
GROUP BY CLASS1_ID, CLASS1_DESC;

SELECT MAX (CLASS2_ID),MAX(CLASS2_DESC)
INTO vCLASS2_ID,vCLASS2_DESC
FROM PRODUCT_CLASSIFICATION
WHERE CLASS2_DESC = P_CLASS2_DESC
GROUP BY CLASS2_ID, CLASS2_DESC;

SELECT MAX (CLASS3_ID),MAX(CLASS3_DESC)
INTO vCLASS3_ID,vCLASS3_DESC
FROM PRODUCT_CLASSIFICATION
WHERE CLASS3_DESC = P_CLASS3_DESC
GROUP BY CLASS3_ID, CLASS3_DESC;

我尝试通过以下方式解决该问题,但我失败了

  • return null使用 EXCEPTION when no_data_found then变量不会解决我的问题,因为函数将停止运行

  • 我尝试使用 NULLIF功能如下,但当存在 wher 时不会返回 null e 子句,当我删除 where 时子句我不会得到一条记录:

    SELECT NULLIF (CLASS1_DESC, 'EXAMPLE') AS CLASS1_DESC
    FROM PRODUCT_CLASSIFICATION
    ---WHERE CLASS1_DESC = 'EXAMPLE'
    GROUP BY CLASS1_DESC

还有其他简单的方法吗?

声明 3 courser 是更好的解决方案吗?

最佳答案

"using EXCEPTION when no_data_found then to variable will not solve my problem since the function will stop running"

使用匿名 block 来定义本地异常部分。这种方法允许您单独处理每个事件,而不会导致较大的程序单元异常终止。

begin
SELECT CLASS1_ID
INTO vCLASS1_ID
FROM PRODUCT_CLASSIFICATION
WHERE CLASS1_DESC = 'EXAMPLE';
exception
when no_data_found then
vCLASS1_ID := null;
end;

begin
SELECT CLASS2_ID
INTO vCLASS2_ID
FROM PRODUCT_CLASSIFICATION
WHERE CLASS2_DESC = 'EXAMPLE';
exception
when no_data_found then
vCLASS2_ID := null;
end;

begin
SELECT CLASS3_ID
INTO vCLASS3_ID
FROM PRODUCT_CLASSIFICATION
WHERE CLASS3_DESC = 'EXAMPLE';
exception
when no_data_found then
vCLASS3_ID := null;
end;

上述解决方案是处理异常的通用方法。但是,@MaheswaranRavisankar 针对此特定问题建议的解决方案(在未找到数据时将变量设置为 null)需要更少的输入:

      SELECT max(CLASS3_ID) 
INTO vCLASS3_ID
FROM PRODUCT_CLASSIFICATION
WHERE CLASS3_DESC = 'EXAMPLE';

这种方法的潜在问题是,如果我们采用 OP 的原始公式,它将不会返回任何行:

 SELECT max(CLASS3_ID) 
INTO vCLASS3_ID
FROM PRODUCT_CLASSIFICATION
WHERE CLASS3_DESC = 'EXAMPLE'
GROUP BY CLASS3_ID;

目前尚不清楚 OP 为什么在其原始查询中使用 GROUP BY。如果表有可能存在重复的 CLASSn_ID,那么正确的方法是:

  • 如果有重复则抛出并处理 TOO_MANY_ROWS 异常
  • 应用建立当前有效类 ID 的业务规则

但是,如果这些都不满足,剩下的打开方法就是

begin
SELECT CLASS3_ID
INTO vCLASS3_ID
FROM PRODUCT_CLASSIFICATION
WHERE CLASS3_DESC = 'EXAMPLE'
GROUP BY CLASS3_ID;
exception
when no_data_found then
vCLASS3_ID := null;
end;

关于oracle - 如何在 select 语句返回未找到数据时返回 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42689549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com