Подтвердить что ты не робот

Как вернуть значение по умолчанию из SQL-запроса

Есть ли какой-либо простой способ вернуть одиночное скалярное значение или значение по умолчанию, если запрос не возвращает строку?

В этот момент у меня есть что-то вроде этого примера кода:

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

Как сделать это лучше, не используя IF-ELSE?

4b9b3361

Ответ 1

Предполагая, что имя не равно NULL, и что Id является уникальным, он может соответствовать не более одной строке.

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

Ответ 2

Попробуйте ISNULL или COALESCE:

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

Внутренний выбор не вернет ничего, если пользователь не существует с этим id, isnull решит этот случай.

Ответ 3

Вы можете отказаться от оператора if, используя следующую конструкцию, но это не означает, что это лучше.

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

Ответ 4

Попробуйте isnull

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

Edit:

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

Ответ 5

Я полагаю, вы могли бы использовать @@ROWCOUNT, чтобы узнать, будет ли возвращен какой-либо файл.

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

Вы также можете использовать переменную, если ожидаете одну строку.

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

Ответ 6

Я бы предположил, что лучший способ сделать это - сначала объявить @name. Затем установите это значение на основе идентификатора пользователя, а затем, если @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') 

Ответ 7

Try this 
`SELECT IFNULL(Name,'John Doe') FROM Users WHERE Id = @UserId)`