web-dev-qa-db-fra.com

Comment renvoyer la valeur par défaut de la requête SQL

Existe-t-il un moyen simple de renvoyer une seule valeur scalaire ou par défaut si la requête ne renvoie aucune ligne?

En ce moment, j'ai quelque chose comme cet exemple de code:

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

Comment faire cela mieux sans utiliser IF-ELSE?

40
Marek Kwiendacz

En supposant que le nom n'est pas nullable et que Id est unique, il peut correspondre à au plus une ligne.

 SELECT 
    ISNULL(MAX(Name),'John Doe')
 FROM 
    Users 
 WHERE 
    Id = @UserId  
67
Martin Smith

Essayez ISNULL ou COALESCE:

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

La sélection interne ne renverra rien si aucun utilisateur n'existe avec cet identifiant, l'isnull résoudra ce cas.

23
Matzi

Vous pouvez supprimer l'instruction if en utilisant la construction suivante, mais cela ne signifie pas nécessairement qu'elle est meilleure.

SELECT Name FROM Users WHERE Id = @UserId UNION ALL 
SELECT 'John Doe' WHERE NOT EXISTS (SELECT Name FROM Users WHERE  Id = @UserId)
4
Lieven Keersmaekers

Essayez isnull

SELECT IsNULL(Name, 'John Doe')  FROM Users WHERE Id = @UserId

Modifier:

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
3
Gulli Meel

Je suppose que vous pouvez utiliser @@ ROWCOUNT pour voir s'il en sera retourné.

SELECT Name FROM Users WHERE Id = @UserId  
if(@@ROWCOUNT = 0)
  SELECT 'John Doe'

Vous pouvez également utiliser une variable si vous attendez une ligne.

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
2
Chris Gessler

Je dirais que la meilleure façon de procéder est de déclarer d'abord @name. Ensuite, définissez cette valeur en fonction de l'ID utilisateur, puis si @name est null, affichez le nom par défaut, sinon affichez le nom ... Cette méthode serait aussi efficace que toute autre méthode et sera plus lisible.pour les autres méthodes, tout autre utilisateur doit avoir pensé à un beaucoup de savoir ce qui se passe à moins qu'il y ait un commentaire agréable.

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') 
2
Gulli Meel
Try this 
`SELECT IFNULL(Name,'John Doe') FROM Users WHERE Id = @UserId)`
1
anik islam Shojib