我有一张像这样的表格。例如。
----------------------
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子句,它只给我一行。但我有点怀疑,如果我搞乱查询,只是尝试使用黑客来做它。请建议是否有更好的方法来做这个或如果我错了。
答案 0 :(得分: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要求您说“来自双重”。