如何从SQL查询返回默认值

时间:2012-07-16 11:37:37

标签: sql sql-server sql-server-2008-r2

如果查询没有返回任何行,是否有任何简单的方法可以返回单个标量或默认值?

此刻我有类似代码的例子:

IF (EXISTS (SELECT * FROM Users WHERE Id = @UserId))  
    SELECT Name FROM Users WHERE Id = @UserId  
ELSE
    --default value
    SELECT 'John Doe'

如何在不使用IF-ELSE的情况下以更好的方式做到这一点?

8 个答案:

答案 0 :(得分:65)

假设名称不可为空并且Id是唯一的,因此最多可以匹配一行。

 SELECT 
    ISNULL(MAX(Name),'John Doe')
 FROM 
    Users 
 WHERE 
    Id = @UserId  

答案 1 :(得分:23)

尝试ISNULLCOALESCE

SELECT ISNULL((SELECT TOP 1 Name FROM Users WHERE Id = @UserId), 'John Doe')

如果没有这个id的用户,内部选择将不返回任何内容,isnull将解决这种情况。

答案 2 :(得分:4)

您可以使用以下构造删除if语句,但这并不一定意味着它更好。

SELECT Name FROM Users WHERE Id = @UserId UNION ALL 
SELECT 'John Doe' WHERE NOT EXISTS (SELECT Name FROM Users WHERE  Id = @UserId)

答案 3 :(得分:3)

尝试isnull

SELECT IsNULL(Name, 'John Doe')  FROM Users WHERE Id = @UserId

编辑:

drop table users
go
create table users
(id int,name varchar(20))
go
insert into users select 1,'1'
 go
declare @userid int
set @userid = 1
select isnull(username.username, 'John Doe')
from (select @userid as userid) userid
outer apply (SELECT  name as username FROM Users WHERE Id = userid.userid ) username
--outer apply (SELECT  name as username FROM Users WHERE Id = @userid ) username

答案 4 :(得分:2)

我想您可以使用@@ ROWCOUNT查看是否会返回任何内容。

SELECT Name FROM Users WHERE Id = @UserId  
if(@@ROWCOUNT = 0)
  SELECT 'John Doe'

如果您期待一行,也可以使用变量。

declare @name varchar(100)
set @name = (select top 1 name from users where id = @userId)
if(@name is null) set @name = 'John Doe'
select @name

答案 5 :(得分:2)

我建议最好的方法是先声明@name。然后根据用户ID设置此值,然后如果@name为null则显示默认名称,否则显示名称...该方法将与任何其他方法一样高效,并且将更具可读性。对于其他任何其他用户认为的其他方法要知道发生了什么,除非有好的评论。

declare @userid int
set @userid = 1
select isnull(
               (select name from users where id = @userid),
               'John Doe'
               )
 go
--My preffered would be this one..
declare @name varchar(20),@userid int
set @userid = 1
select  @name =  name from users where id = @userid
select isnull(@name,'John Doe') 

答案 6 :(得分:1)

Try this 
`SELECT IFNULL(Name,'John Doe') FROM Users WHERE Id = @UserId)`

答案 7 :(得分:0)

如果查询最多返回一行,请使用默认值加上限制的并集:

SELECT * FROM 
 (
  SELECT Name FROM Users WHERE Id = @UserId`
  UNION
  SELECT 'John Doe' AS Name --Default value
 ) AS subquery
LIMIT 1

查询和默认值都可以根据需要包含任意多的列,并且不必保证它们不为空。