【问题标题】:Is it possible to force reutrn value from query when no rows found? [duplicate]找不到行时是否可以从查询中强制返回值? [复制]
【发布时间】:2016-04-03 03:09:44
【问题描述】:

我有一个简单的查询:

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

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

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

我试过了:

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

但是好像没有行合并是无用的。 如果没有找到行,它应该给0

我该如何解决?

【问题讨论】:

  • 查询不返回任何行时1行的值应该是多少
  • 值应该是0

标签: sql postgresql


【解决方案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

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

所以现在存在至少找到一行并将附加行添加到末尾的情况。在这种情况下,找到的第一行(参见->)将按优先级升序返回:

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

还有没有找到行但又返回了额外行的情况:

   qty priority
-> 0   1

【讨论】:

  • 单独的代码块并不能提供好的答案。请添加解释(为什么它解决了问题,错误在哪里等等......)
  • @LouisBarranqueiro 你是对的,我编辑了我的答案以提供额外的解释。
  • coalesce 技术对于标量子查询非常方便。但在任何其他情况下,这是这样做的方法。
【解决方案2】:

你可以这样做:

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

如果内部SELECT 语句没有返回任何内容,COALESCE 将在外部SELECT 语句中为您提供0

【讨论】:

    【解决方案3】:

    试试这个。

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

    【讨论】:

    • 语法错误,因为select qty from X where id=....;。从子查询中删除;
    • @lad2025 它的虚拟数据不是真实的,所以我没有删除它。也不仅需要删除;但还需要在 where id=? 中分配一些适当的值
    • 重点是...表示缺失值,;是查询的一部分。不管它是不是虚拟的。做对了demo
    【解决方案4】:

    不使用COALESCE()

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

    Demo

    【讨论】:

    • 如果没有order by,结果是不可预见的。检查select 1 union select 0 limit 1;
    • @ClodoaldoNeto 感谢您的挑剔!!
    【解决方案5】:

    如果没有找到记录,则返回 'No rows found'

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

    每当您使用它时,您都会收到记录否则找不到记录的消息。

    【讨论】:

      猜你喜欢
      • 2014-06-14
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 2017-06-15
      • 2014-03-13
      • 2015-10-06
      相关资源
      最近更新 更多