如果查询不返回任何行,是否有任何简单的方法可以返回单个标量或默认值?
此刻我有这样的代码示例:
IF (EXISTS (SELECT * FROM Users WHERE Id = @UserId))
SELECT Name FROM Users WHERE Id = @UserId
ELSE
--default value
SELECT 'John Doe'
如何在不使用 IF-ELSE 的情况下以更好的方式做到这一点?
如果查询不返回任何行,是否有任何简单的方法可以返回单个标量或默认值?
此刻我有这样的代码示例:
IF (EXISTS (SELECT * FROM Users WHERE Id = @UserId))
SELECT Name FROM Users WHERE Id = @UserId
ELSE
--default value
SELECT 'John Doe'
如何在不使用 IF-ELSE 的情况下以更好的方式做到这一点?
假设名称不可为空并且Id
是唯一的,因此最多可以匹配一行。
SELECT
ISNULL(MAX(Name),'John Doe')
FROM
Users
WHERE
Id = @UserId
尝试ISNULL
或COALESCE
:
SELECT ISNULL((SELECT TOP 1 Name FROM Users WHERE Id = @UserId), 'John Doe')
如果不存在具有此 id 的用户,则内部选择将不返回任何内容,isnull 将解决这种情况。
Try this
`SELECT IFNULL(Name,'John Doe') FROM Users WHERE Id = @UserId)`
您可以使用以下构造删除 if 语句,但这并不一定意味着它更好。
SELECT Name FROM Users WHERE Id = @UserId UNION ALL
SELECT 'John Doe' WHERE NOT EXISTS (SELECT Name FROM Users WHERE Id = @UserId)
试试 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
我想您可以使用 @@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
我建议最好的方法是首先声明 @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')
如果查询应该最多返回一行,请使用具有默认值的联合,然后使用限制:
SELECT * FROM
(
SELECT Name FROM Users WHERE Id = @UserId`
UNION
SELECT 'John Doe' AS Name --Default value
) AS subquery
LIMIT 1
查询和默认值都可以有任意多的列,您不需要保证它们不为空。