0

たとえば、このようなテーブル Emp があります。

----------------------
eName      | eId
----------------------
Anusha       1
Sunny        2

ID が 3 のエントリを探しているとします。行を見つけて表示するクエリを書きたいのですが、見つからない場合は、デフォルトの行 (temp,999) を表示することが期待されます。

select case
when (total != 0) then (select eName from Emp where eId = 3)
when (total == 0) then "temp"
end as eName,
case
when (total != 0) then (select eId from Emp where eId = 3)
when (total == 0) then 999
end as eId
from Emp,(select count(*) as total from Emp where eId = 3);

私が書いたこのクエリを使用すると、結果として2行が得られます。

temp  999
temp  999

(select count(*) as total from Emp where eId = 3)クエリのfromリストにあるこのクエリが原因だと思い ます。

個別句を使用してみましたが、1 行しか表示されません。しかし、クエリを台無しにして、おそらくハックを使用してそれを実行しようとしているだけであるかどうかは少し疑わしいです.これを行うためのより良い方法があるかどうか、または私が間違っているかどうかを提案してください.

4

1 に答える 1

0

これを正しく行う方法について説明しますが、最初に、SQL の理解に役立つかもしれない長い回答をさせてください。使用するために起こっていることはこれです:

select 句は、取得するレコードの数には影響しません。何が起こっているのかを理解するために、クエリを少し単純化してみましょう。に変更しましょう。

select * from emp, (select count(*) as total from emp where eid=3)

「emp」の後のコンマがここで何をしていると思うかわかりませんが、SQL はこれを 2 つのテーブルの古いスタイルの結合と見なします: emp と select count(*) によって作成された一時テーブルなどです。 WHERE 句なので、これはクロス結合ですが、2 番目のテーブルにはレコードが 1 つしかないため、その部分は問題ではありません。しかし、WHERE 句がないということは、カウントに結合された emp のすべてのレコードを取得することを意味します。したがって、このクエリの出力は次のようになります。

ename   eid  count(*)
Anusha  1    0
Sunny   2    0

100 件のレコードがある場合、100 件の結果が得られます。

率直に言って、SQL で必要なことを行うための本当にクリーンな方法はありません。これは、コードで実行する方がクリーンな種類のものです。単純な「select ... where eid=3」を実行し、レコードが取得されない場合は、実行時にデフォルトを入力します。

しかし、何らかの理由で SQL でそれを行う必要があると仮定すると、最も簡単な方法は次のようになると思います。

select eid, ename from emp where eid=3
union
select 999 as eid, 'temp' as ename
where not exists (select 1 from emp where eid=3)

SQL の一部のバージョンでは、2 番目の選択でダミーのテーブル名を指定する必要があります。たとえば、Oracle では「デュアルから」と言う必要があります。

于 2012-04-27T18:33:45.257 に答える