如果查询没有返回任何行,是否有任何简单的方法可以返回单个标量或默认值?
此刻我有类似代码的例子:
IF (EXISTS (SELECT * FROM Users WHERE Id = @UserId))
SELECT Name FROM Users WHERE Id = @UserId
ELSE
--default value
SELECT 'John Doe'
如何在不使用IF-ELSE的情况下以更好的方式做到这一点?
答案 0 :(得分:65)
假设名称不可为空并且Id
是唯一的,因此最多可以匹配一行。
SELECT
ISNULL(MAX(Name),'John Doe')
FROM
Users
WHERE
Id = @UserId
答案 1 :(得分:23)
尝试ISNULL
或COALESCE
:
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
查询和默认值都可以根据需要包含任意多的列,并且不必保证它们不为空。