如何在 select 语句 return 未找到数据时 return 为空

How to return Null when a select statement returns no data found

我有这三个 select 语句,当没有数据时,我试图 return 为变量 vCLASS1_IDvCLASS2_IDvCLASS3_ID null成立。

  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;

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

还有其他简单的方法吗?

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

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

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

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 的原始公式,它将 return 没有行:

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

不清楚为什么 OP 在其原始查询中使用 GROUP BY。如果 table 有可能重复 CLASSn_IDs 那么正确的方法是:

  • 抛出并处理 TOO_MANY_ROWS 异常如果有重复项
  • 应用建立当前有效 Class 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;    

我认为可以通过使用外连接来完成

WITH TEMP AS (SELECT 'EXAMPLE' AS VAL FROM DUAL)
SELECT T1.CLASS1_ID 
  --INTO vCLASS1_ID
    FROM PRODUCT_CLASSIFICATION T1,
         TEMP T2
    WHERE T1.CLASS1_DESC(+) = T2.VAL
GROUP BY T1.CLASS1_ID