如何在 select 语句 return 未找到数据时 return 为空
How to return Null when a select statement returns no data found
我有这三个 select 语句,当没有数据时,我试图 return 为变量 vCLASS1_ID
或 vCLASS2_ID
或 vCLASS3_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;
我尝试通过以下方式解决该问题,但我失败了
return null
使用 EXCEPTION when no_data_found then
变量不会解决我的问题,因为函数将停止 运行
我尝试使用下面的 NULLIF
函数,但是当有 wher
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"
使用匿名块来定义本地异常部分。这种方法允许您单独处理每个事件,而不会导致较大的程序单元异常终止。
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
我有这三个 select 语句,当没有数据时,我试图 return 为变量 vCLASS1_ID
或 vCLASS2_ID
或 vCLASS3_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;
我尝试通过以下方式解决该问题,但我失败了
return null
使用EXCEPTION when no_data_found then
变量不会解决我的问题,因为函数将停止 运行我尝试使用下面的
NULLIF
函数,但是当有wher
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"
使用匿名块来定义本地异常部分。这种方法允许您单独处理每个事件,而不会导致较大的程序单元异常终止。
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