クエリが行を返さない場合、単一のスカラーまたはデフォルト値を返す簡単な方法はありますか?
現時点では、このコード例のようなものがあります。
IF (EXISTS (SELECT * FROM Users WHERE Id = @UserId))
SELECT Name FROM Users WHERE Id = @UserId
ELSE
--default value
SELECT 'John Doe'
IF-ELSEを使用せずにそれをより良い方法で行う方法は?
名前がNULL可能ではなく、Id
が一意であるため、最大で1つの行に一致すると仮定します。
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を持つユーザーが存在しない場合、内部selectは何も返しません。isnullはこのケースを解決します。
次のコンストラクトを使用して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'
1行が必要な場合は、変数を使用することもできます。
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が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')
Try this
`SELECT IFNULL(Name,'John Doe') FROM Users WHERE Id = @UserId)`