9

次のようなクエリがあります。

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

通常、このクエリは正確に 1 行を返す必要があります。に一致するものがないv_t_id場合、プログラムは「データが見つかりません」という例外で失敗します。

これを 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 ソリューションをチェックインする必要がありますか?

(オラクル10g)

4

6 に答える 6

21

これをよりシンプルでクリーンにする方法はありますが、これは基本的にテクニックを詳しく説明しています。

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
)

ユニオンの最初の部分が空の場合、2番目の部分には行が含まれ、最初の部分が空でない場合、2番目の部分には行が含まれません。

クエリに時間がかかる場合は、次のクエリを使用してください。

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
于 2011-01-13T17:18:51.043 に答える
9

例外を処理したいと思います。ただし、これは指定したとおりに機能します。

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

これは、クエリが複数の行を返す場合にも「機能」することに注意してください。つまり、TOO_MANY_ROWSは発生しません。

于 2011-01-13T17:06:09.703 に答える
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
于 2011-01-13T17:13:47.630 に答える
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;
于 2015-03-19T15:05:14.427 に答える
0

https://stackoverflow.com/a/4683045/471149答えはいいですが、より短い解決策があります

select * from my_table ce, (select 150 as id from dual) d
where d.id = ce.entry_id (+)
于 2012-02-01T09:51:16.833 に答える
-1

常に0行または1行が必要な場合は、グループ関数を使用できます。

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

レコードが見つからない場合は、常に少なくとも1つの行とNULLの値を取得します。

于 2011-01-13T17:04:41.530 に答える