source

Oracle: 데이터를 찾을 수 없는 경우에도 항상 하나의 행만 반환하는 쿼리를 가져옵니다.

ittop 2023. 10. 9. 23:32
반응형

Oracle: 데이터를 찾을 수 없는 경우에도 항상 하나의 행만 반환하는 쿼리를 가져옵니다.

다음과 같은 질문이 있습니다.

   select data_name
   into v_name
   from data_table
   where data_table.type = v_t_id

일반적으로 이 쿼리는 정확히 하나의 행을 반환해야 합니다.성냥이 없을 때는v_t_id, 프로그램이 실패하고 "No data found"(데이터를 찾을 수 없음) 예외가 발생합니다.

PL/SQL에서 이 문제를 처리할 수 있다는 것은 알고 있지만 쿼리에서만 이 문제를 처리할 수 있는 방법이 있는지 궁금합니다.시험 삼아 해봤어요

select case
           when subq.data_name is null then
            'UNKNOWN'
           else
            subq.data_name
       end
from (select data_name
       from data_table
       where data_table.type = '53' /*53 does not exist, will result in 0 rows. Need fix this...*/
       ) subq;

...하지만 이건 분명히 효과가 없을 겁니다 (왜냐하면)subq비어 있다는 것은 와 같지 않습니다.subq.data_name is null). 이것이 가능하기는 하나요 아니면 그냥 PL/SQL 솔루션을 체크인해야 하나요?

(oracle 10g)

이것을 더 간단하고 깨끗하게 만드는 방법들이 있지만, 이것은 기본적으로 기술을 설명합니다.

SELECT data_name
FROM data_table
WHERE data_table.type = v_t_id

UNION ALL

SELECT NULL AS data_name
FROM dual
WHERE NOT EXISTS (
    SELECT data_name
    FROM data_table
    WHERE data_table.type = v_t_id
)

조합의 첫 번째 부분이 비어 있으면 두 번째 부분에 행이 들어 있고, 첫 번째 부분이 비어 있지 않으면 두 번째 부분에 행이 들어 있지 않습니다.

쿼리에 시간이 많이 걸리는 경우 다음을 사용합니다.

SELECT * FROM (  
    SELECT data_name
    FROM data_table
    WHERE data_table.type = v_t_id

    UNION ALL

    SELECT NULL AS data_name
    FROM dual
  ) WHERE data_name is not null or ROWNUM = 1

저는 그 예외를 처리하고 싶습니다.그러나 이는 사용자가 지정하는 대로 작동합니다.

select min(data_name) data_name
into v_name
from data_table
where data_table.type = v_t_id

쿼리가 1개 이상의 행을 반환하는 경우에도 "작동"합니다.TOO_MANY_ROWs가 상승하지 않았습니다.

LEFT AUTER JOIN을 사용한 간단한 솔루션은 다음과 같습니다.

CREATE TABLE data_table(data_name VARCHAR2(20), data_type NUMBER(2));

INSERT INTO data_table(data_name, data_type) VALUES('fifty-one', 51);

SELECT coalesce(data_name, 'unknown')
  FROM dual
  LEFT OUTER JOIN (SELECT data_name FROM data_table WHERE data_type = 53) o
    ON 1 = 1;

SELECT coalesce(data_name, 'unknown')
  FROM dual
  LEFT OUTER JOIN (SELECT data_name FROM data_table WHERE data_type = 51) o
    ON 1 = 1;
 select coalesce(data_table.data_name, d.data_name) data_name
   into v_name
   from 
   (SELECT 'UNKNOWN ' as data_name FROM DUAL)  d
   LEFT JOIN data_table
   ON data_table.type = v_t_id
          or a.data_table.data_name is null

https://stackoverflow.com/a/4683045/471149 답변도 좋지만, 더 짧은 해결책이 있습니다.

select * from my_table ce, (select 150 as id from dual) d
where d.id = ce.entry_id (+)

항상 0개 또는 1개의 행이 예상되는 경우 그룹 함수를 사용할 수 있습니다.

select dump(max(dummy)) from dual
where dummy = 'Not Found'

레코드를 찾을 수 없는 경우에는 항상 하나 이상의 행과 NULL 값을 얻게 됩니다.

언급URL : https://stackoverflow.com/questions/4682821/oracle-get-a-query-to-always-return-exactly-one-row-even-when-theres-no-data

반응형