it-swarm.com.de

So geben Sie einen Standardwert aus einer SQL-Abfrage zurück

Gibt es eine einfache Möglichkeit, einen einzelnen Skalar- oder Standardwert zurückzugeben, wenn die Abfrage keine Zeile zurückgibt?

In diesem Moment habe ich so etwas wie dieses Codebeispiel:

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

Wie geht das besser ohne IF-ELSE?

40
Marek Kwiendacz

Angenommen, der Name ist nicht nullwertfähig und Id ist eindeutig, sodass höchstens eine Zeile übereinstimmen kann.

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

Versuchen Sie ISNULL oder COALESCE:

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

Die innere Auswahl gibt nichts zurück, wenn kein Benutzer mit dieser ID existiert. Das ist nichts, um diesen Fall zu lösen.

23
Matzi

Sie können die if-Anweisung mit folgendem Konstrukt löschen, was jedoch nicht unbedingt bedeutet, dass es besser ist.

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

Versuchen Sie es nicht

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

Bearbeiten:

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

Ich nehme an, Sie könnten @@ ROWCOUNT verwenden, um zu sehen, ob irgendwelche zurückgegeben werden.

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

Sie können auch eine Variable verwenden, wenn Sie eine Zeile erwarten.

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

Ich würde vorschlagen, dass der beste Weg ist, zuerst @name zu deklarieren. Setzen Sie dann diesen Wert basierend auf der Benutzer-ID und wenn @name null ist, zeigen Sie den Standardnamen an, andernfalls zeigen Sie den Namen an ... Diese Methode ist genauso effizient wie jede andere Methode und ist für andere Methoden besser lesbar viel zu wissen, was los ist, es sei denn, es gibt nette Kommentare.

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