当没有找到行时,是否可以强制查询中的reutrn值?

时间:2015-12-29 08:47:47

标签: sql postgresql

我有一个简单的查询:

Select qty from X where id=....;

此查询始终返回0或1行。 当它返回1行时一切正常。 但如果它返回0行,我的查询将失败,因为qty用于计算。 (这实际上是Select statment中的Sub查询。)

我需要以某种方式确保查询始终返回1行。

我试过了:

Select coalesce(qty,0) from X where id=....;

但它没有帮助,好像没有行,合并是没用的。 如果没有找到行,则应该提供0

我该如何解决?

5 个答案:

答案 0 :(得分:10)

你可以这样做:

SELECT COALESCE( (SELECT qty from X where id=....), 0)

如果内部SELECT语句未返回任何内容,则COALESCE会在外部0语句中为您提供SELECT

答案 1 :(得分:1)

Select *.a from (
  Select qty, 0 as priority from X where id=....
  Union
  Select 0, 1 as priority
) a
Order By a.priority Asc
Limit 1

这个选择基本上确保通过在末尾添加一个额外的行来返回至少一行,并通过添加limit语句我们只返回第一行。

所以现在有一种情况,即至少找到一行,并在末尾添加额外的行。在这种情况下,由于按优先级递增的顺序,将返回找到的第一行(请参阅->):

   qty priority
-> 1   0 
   3   0
   4   0
   .   .
   0   1

然后会出现没有找到行但返回附加行的情况:

   qty priority
-> 0   1

答案 2 :(得分:0)

试试这个。

SELECT COALESCE((SELECT qty 
                 FROM   x 
                 WHERE  id = @MyIdVar), 1) 

答案 3 :(得分:0)

不使用COALESCE()

 select qty from X where id=1 UNION SELECT 0 order by qty desc limit 1

Demo

答案 4 :(得分:0)

如果未找到任何记录,则返回'未找到任何行'

if not exists(Select * from table where condition=...)
Begin
Select * from table where condition=...
End
Else
Begin
Select 'No rows found'
End

每当你使用它时,你将获得记录,否则没有找到记录消息。