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);

使用我编写的这个查询,它给了我两行结果。

temp  999
temp  999

我认为这是因为 (select count(*) as total from Emp where eId = 3)查询列表中的这个查询。

我尝试使用 distinct 子句,它只给了我一行。但是我有点怀疑我是否弄乱了查询并且只是试图使用黑客来做到这一点。请建议是否有更好的方法来做到这一点或者我是否错了。

4

1 回答 1

0

我将介绍如何正确执行此操作,但首先让我给您一个长长的答案,以帮助您理解 SQL。使用情况是这样的:

您的 select 子句不会影响您获得的记录数。所以为了理解发生了什么,让我们稍微简化一下查询。让我们把它改成,

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

我不确定你认为“emp”后面的逗号在这里做了什么,但 SQL 将其视为两个表的旧式连接:emp 和由 select count(*) 创建的临时表等。没有WHERE 子句,所以这是一个交叉连接,但是第二张表无论如何只有一条记录,所以那部分无关紧要。但是没有 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 版本中,您需要在第二次选择时提供一个虚拟表名,例如 Oracle 要求您说“从双重”。

于 2012-04-27T18:33:45.257 回答