【问题标题】:Return a value if no rows match如果没有行匹配,则返回一个值
【发布时间】:2014-07-28 16:40:28
【问题描述】:

[authorityID] (TinyInt) 列永远不会是 null

如果没有行,我想要返回 15。使用下面的查询,如果没有行,我什么也得不到:

select top 1 isnull([authorityID],15) 
from [docAuthority] with (nolock) 
where [grpID] = 0 and [sID] = 42

【问题讨论】:

    标签: sql-server tsql select


    【解决方案1】:
    SELECT  authorityId = isnull(( SELECT   [authorityID]
                                   FROM     [docAuthority] WITH ( NOLOCK )
                                   WHERE    [grpID] = 0
                                            AND [sID] = 42
                                 ), 15)
    

    【讨论】:

      【解决方案2】:

      如您所述,如果查询未返回任何行,则无需应用 isnull。一个肮脏的技巧是使用union all 和(ab)使用top 构造:

      SELECT TOP 1 authorityID
      FROM   (SELECT authorityID
              FROM   [docAuthority] WITH (nolock) 
              WHERE  [grpID] = 0 AND [sID] = 42
              UNION ALL
              SELECT 15) t
      

      【讨论】:

      • 不像我希望的那样光滑,但我认为没有比这更好的了。在我接受这个答案之前,让我给它几个小时的时间。附言由于我正在阅读 .NET,如果在 TSQL 中没有更直接的方法,我将在那里进行。
      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多