47

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

此刻我有这样的代码示例:

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

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

4

8 回答 8

78

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

 SELECT 
    ISNULL(MAX(Name),'John Doe')
 FROM 
    Users 
 WHERE 
    Id = @UserId  
于 2012-07-16T11:49:47.127 回答
27

尝试ISNULLCOALESCE

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

如果不存在具有此 id 的用户,则内部选择将不返回任何内容,isnull 将解决这种情况。

于 2012-07-16T11:40:09.590 回答
6
Try this 
`SELECT IFNULL(Name,'John Doe') FROM Users WHERE Id = @UserId)`
于 2017-02-23T10:30:01.120 回答
4

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

SELECT Name FROM Users WHERE Id = @UserId UNION ALL 
SELECT 'John Doe' WHERE NOT EXISTS (SELECT Name FROM Users WHERE  Id = @UserId)
于 2012-07-16T11:42:17.470 回答
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
于 2012-07-16T11:43:17.670 回答
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
于 2012-07-16T11:47:49.227 回答
2

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

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') 
于 2012-07-16T13:41:04.683 回答
0

如果查询应该最多返回一行,请使用具有默认值的联合,然后使用限制:

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

查询和默认值都可以有任意多的列,您不需要保证它们不为空。

于 2020-09-09T16:59:12.053 回答