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?
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
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.
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)
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
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
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')
Try this
`SELECT IFNULL(Name,'John Doe') FROM Users WHERE Id = @UserId)`