【问题标题】:SELECT INTO do not store null in to the variablesSELECT INTO 不将 null 存储到变量中
【发布时间】:2021-09-28 11:22:31
【问题描述】:

我试图检查这两个表中的值,并且我只想在 TableA 中找到该值时才继续进行下一个查询。下面的逻辑有问题,当没有数据时,它会进入异常而不是将NULL存储到变量中。

SET SERVEROUTPUT ON;
SET FEEDBACK OFF;
SPOOL temp.txt;
DECLARE
    v_ATM TableA.CODE%TYPE := NULL;
    v_TBL TableB.CODE%TYPE := NULL;
BEGIN
    SELECT TableA.CODE, TableB.CODE INTO v_ATM,v_TBL FROM TableA LEFT JOIN TableB ON TableA.CODE = TableB.CODE WHERE TableA.CODE = 'ABC';
    IF (v_ATM IS NULL) AND (v_TBL IS NULL) THEN
        DBMS_OUTPUT.PUT_LINE('No value found');
    ELSIF (v_ATM IS NOT NULL) AND (v_TBL IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('Found in both');
    ELSIF (v_ATM IS NULL) AND (v_TBL IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('Found in Table B');
    ELSIF (v_ATM IS NOT NULL) AND (v_TBL IS NULL) THEN
        DBMS_OUTPUT.PUT_LINE('Found in Table A');
    END IF;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Exception');
END;

或者我正在尝试:

SELECT TableA.CODE INTO v_ATM FROM TableA WHERE TableA.CODE = 'ABC';
SELECT TableB.CODE INTO v_TBL FROM TableB WHERE TableB.CODE = 'ABC';

但是,如果没有找到 ABC,v_ATM 不会存储 NULL,并进入异常。

【问题讨论】:

  • 在询问 SQL 问题时,几乎总是需要为您正在使用的特定 DBMS 添加标签,因为它们之间的功能和语法差异很大。请edit您的帖子添加该标签。
  • 缺席行既没有 null 也没有 null 值。它不存在。处理no_data_found 异常并继续。

标签: sql oracle sqlplus


【解决方案1】:

--而不是选择代码 col 来获取 null/not null,选择 count(1) 以获取 0/1 作为输出而没有错误

with 
TableA as (
--select 'ABC' as code from dual 
--union all
select 'DEF' as code from dual
),
TableB as (
--select 'ABC' as code from dual 
--union all
select 'DEF' as code from dual
),
q1 as (
SELECT 1 as id, count(1) as cnt FROM TableA WHERE TableA.CODE = 'ABC'
),
q2 as (
SELECT 1 as id, count(1) as cnt FROM TableB WHERE TableB.CODE = 'ABC'
)
select 
   cast(
   case 
      when q1.cnt = 0 and q2.cnt = 0 then 'Both missing'
      when q1.cnt = 1 and q2.cnt = 0 then 'TableA present, TableB missing'
      when q1.cnt = 0 and q2.cnt = 1 then 'TableA missing, TableB present'
      when q1.cnt = 1 and q2.cnt = 1 then 'Both present'
      else 'NA'
   end as varchar2(40)) as output_txt
from q1 inner join q2 on (q1.id = q2.id)
;

通过隐藏 ABC 和 DEF 来使用 sql,并根据需要合并所有代码行以获得不同条件下的不同输出。

【讨论】:

    【解决方案2】:

    您是从行中选择的,而不是标量值,因此如果没有行,则没有值。

    如果你SELECT MAX(TableA.CODE) ... WHERE ...

    你会得到一个可以使用的值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-26
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2017-08-20
      • 2023-03-12
      • 2018-10-31
      相关资源
      最近更新 更多