I have a table Emp like this for example.
----------------------
eName | eId
----------------------
Anusha 1
Sunny 2
Say i am looking for an entry whose id is 3.I want to write a query which finds the row and displays it.But if it doesnt find it it is expected to display a default row (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);
Using this query that i wrote it gives me two rows as a result.
temp 999
temp 999
I assume it is because of
(select count(*) as total from Emp where eId = 3) this query in the from list of the query.
I tried using the distinct clause and it gives me just a single row. But i am a little doubtful if i am messing the query and only trying to probably employ a hack to do it.Please suggest if there is a better way to do this or if i am wrong.
I’ll get to how to do this right, but first let me give you a long answer to maybe help you with your understanding of SQL. What’s happening to use is this:
Your select clause does not affect the number of records you get. So to understand what’s happenning, let’s simpify the query a little. Let’s change it to,
I’m not sure what you think the comma after “emp” does here, but SQL see this as an old-style join on two tables: emp and the temporary table created by the select count(*), etc. There is no WHERE clause, so this is a cross join, but the second table only has one record anyway, so that part doesn’t matter. But the fact that there is no WHERE clause means that you will get every record in emp, joined to the count. So the output of this query is:
If you had 100 records, you would get 100 results.
Frankly there is no really clean way to do what you want in SQL. It’s the sort of thing that’s cleaner to do in code: do a plain “select … where eid=3”, and if you get no records, fill in the default at run-time.
But assuming that you need to do it in SQL for some reason, I think the simplest way would be:
In some versions of SQL you need to give a dummy table name on the second select, like Oracle requires you to say “from dual”.