Sqlite select查询 - 返回默认行?

时间:2012-04-27 18:04:49

标签: database sqlite select

我有一张像这样的表格。例如。

----------------------
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子句,它只给我一行。但我有点怀疑,如果我搞乱查询,只是尝试使用黑客来做它。请建议是否有更好的方法来做这个或如果我错了。

1 个答案:

答案 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要求您说“来自双重”。