【问题标题】:Is there a better way to return 0 if row doesn't exist?如果行不存在,是否有更好的方法返回 0?
【发布时间】:2015-10-08 15:52:32
【问题描述】:

所以我的目标是选择 John 的 id 并将其返回给调用应用程序。如果 John 不存在,我想将 0 返回给应用程序。这样做的正确方法是什么?

IF EXISTS(SELECT ID From Table WHERE Name = 'John' ) 

    SELECT ID From Table WHERE Name = 'John' 

ELSE 

    SELECT 0

【问题讨论】:

  • 可以用也可以IF EXISTS(SELECT 1 From Table WHERE Name = 'John' )
  • 所以你想让 0 成为一个代表没有行的魔法值?为什么应用程序不能理解 no rows = no rows?

标签: sql-server performance sql-server-2008


【解决方案1】:

假设 John 只有一个 ID:

declare @ID int = 0
select @ID = ID From Table WHERE Name = 'John'
select @ID

【讨论】:

  • 请注意,如果 Name 不是唯一的,这将选择一个不可预测的任意行,因此即使没有数据更改,您也可能不会总是看到相同的 ID。
【解决方案2】:

如果你使用Sql server,你可以使用:

SELECT ISNULL((SELECT ID From Table WHERE Name = 'John' ), 0)

对于Oracle,等效的方法是NVL(field,default_value); (未测试)

【讨论】:

  • 请注意,如果John 发现多于一行,则会产生以下错误:Msg 512, Level 16, State 1 / Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
  • 你是对的。这主要用于检索特定的 id。感谢您的评论。
【解决方案3】:

即使Table有几行Name = 'John',这个解决方案也可以工作

SELECT ISNULL([Table].ID, ZeroID.ID) ID
FROM (SELECT 0 ID) ZeroID
    LEFT JOIN [Table] ON [Table].Name = 'John'

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2012-06-13
    • 2011-03-12
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2021-05-06
    相关资源
    最近更新 更多