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
'source' 카테고리의 다른 글
"javscript:void(0);" vs "return false" vs "preventDefault()" (0) | 2023.10.09 |
---|---|
WooCommerce - 배송비 재정의 (0) | 2023.10.09 |
PowerShell의 어레이에 요소를 동적으로 추가하려면 어떻게 해야 합니까? (0) | 2023.10.09 |
자바에서 pl/sql 함수를 호출하시겠습니까? (0) | 2023.10.09 |
Android의 컨텍스트에서 작업 가져오기 (0) | 2023.10.09 |