簡體   English   中英

SELECT INTO 不將 null 存儲到變量中

[英]SELECT INTO do not store null in to the variables

我試圖檢查兩個表中的值,並且只有在 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,並進入異常狀態。

您是從一行中進行選擇,而不是從標量值中進行選擇,因此如果沒有行,則沒有值。

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

你會得到一個使用價值

-- 而不是選擇代碼 col 來獲得空/非空,選擇 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,以獲得不同條件下的不同輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM