2011-01-13 5 views
7

발견 할 데이터가 없습니다 경우에도 쿼리는 항상 정확히 하나의 행을 반환 받기 :오라클 :이 같은 쿼리가

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

일반적으로는,이 쿼리는 정확히 하나의 행을 반환해야합니다. v_t_id에 일치 항목이 없으면 "데이터 없음"예외로 프로그램이 실패합니다.

나는 을 알고 있습니다.은 PL/SQL에서 이것을 처리 할 수 ​​있지만, 쿼리에서만이 작업을 수행 할 수 있는지 궁금합니다. (subq이 비어있는 것은 subq.data_name is null와 동일하지 않기 때문에)

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; 

을 ... 그러나 이것은 분명히 작동하지 않습니다 테스트, 나는 시도했습니다. 이것도 가능합니까 아니면 그냥 PL/SQL 솔루션을 체크인해야합니까?

(오라클 10g)

+1

쿼리가 행을 반환하지 않으면 어떤 값을 가질 것으로 기대합니까? 데이터를 찾을 수없는 상태를 처리해야하는 과제입니다. –

+0

@ 토마스 :이 시나리오에서는 "UNKNOWN"문자열이 정상적으로 작동합니다. – FrustratedWithFormsDesigner

답변

18

가이 간단하고 청소기 만들 수있는 방법을하지만 이것은 기본적으로 기술을 밖으로 철자 : 노동 조합의 첫 번째 부분이 비어있는 경우

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 
+0

나는 이것을 좋아한다. '존재하지 않는다'는 것은 모든 것을 의미가 분명하게 만든다. – FrustratedWithFormsDesigner

0

당신은 항상 0 또는 1 개 행이 다음 그룹 기능 즉 사용할 수 있습니다 예상되는 경우 :

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

당신은 항상 하나 이상의 행과 NULL의 값을 얻을 것이다 레코드가 발견되지 않는 경우.

9

나는 예외를 처리하는 것을 선호합니다. 그러나이 사용자가 지정한대로 작동합니다 : 쿼리 1 개보다 행을 반환하는 경우 이것은 또한 "작동"

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

하는 것으로 - 즉 TOO_MANY_ROWS가 발생하지 않습니다.

+0

'분'으로 똑똑한 트릭! – FrustratedWithFormsDesigner

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 
1

것은 내 간단한 해결책은 LEFT OUTER 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; 
관련 문제