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

名前が null 可能ではなく、それが一意であると仮定すると、Id最大で 1 行に一致する可能性があります。

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

ISNULLまたはを試してくださいCOALESCE

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

この ID を持つユーザーが存在しない場合、内側の選択は何も返しません。isnull がこのケースを解決します。

于 2012-07-16T11:40:09.590 に答える
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

null を試す

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'

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
于 2012-07-16T11:47:49.227 に答える
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') 
于 2012-07-16T13:41:04.683 に答える