2009-08-28 3 views
2

Я получаю от программирования программирования, в конечном итоге пишу TSQL недавно с моей новой работой. Мое мышление все еще думает о написании запросов с условиями. Как избежать следующего запроса без условия.TSQL, как избежать, если условия?

DECLARE @NumAddress INT 

SELECT 
    @NumAddress = COUNT(*) 
FROM Address 
    WHERE UserID = 1001 

IF @NumAddress > 0 
BEGIN 
    SELECT 
     u.FullName, a.Address AS Address 
    FROM 
     Users u 
     JOIN Address a ON a.UserID = u.UserID 
    WHERE 
     u.UserId = 1000 
END 
ELSE 
BEGIN 
    SELECT 
     u.FullName, NULL AS Address 
    FROM 
     Users u 
    WHERE 
     u.UserId = 1000 
END 

ПРИМЕЧАНИЕ. Мой пример запроса является упрощенным примером моего фактического запроса. Поэтому, пожалуйста, проигнорируйте это и предоставьте мне пример, так как я мог бы избежать условий IF, подобных этому. Заранее спасибо.

ответ

4

В данном конкретном случае, вы лучше использовать left join:

select 
    u.FullName, 
    a.Address 
from 
    users u 
    left join address a on 
     a.userid = u.userid 
where 
    u.userid = 1000 

Это будет возвращать все null для address столбцов, если совпадений не найдено.

Однако, чтобы ответить на ваш вопрос в более общем смысле, вы можете использовать case statement в запросе, чтобы избежать необходимости иметь целый whoopla:

select 
    u.fullname, 
    case 
     when (select count(*) from address where userid = u.userid) > 0 then 1 
     else 0 
    end as AddressSupplied 
from 
    users u 
where 
    userid = 1000 

case является switch заявление в SQL, так что вы может это сделать:

case col_name 
    when 'Val1' then 'Yup' 
    when 'Val2' then 'Well...' 
    when 'Val3' then 'Nope.' 
    else 'What now?' 
end 

Это будет проверять столбец col_name на каждой строке, а если одно из значений, указанных, он возвращает правильный then. Таким образом, образец запроса и набор результатов:

select 
    col_name, 
    case col_name 
     when 'Val1' then 'Yup' 
     when 'Val2' then 'Well...' 
     when 'Val3' then 'Nope.' 
     else 'What now?' 
    end as some_col 
from 
    tableA 

-------------------- 
col_name some_val 
-------------------- 
Val1  Yup 
Val2  Well... 
Val1  Yup 
Val4  What now? 
Val3  Nope. 

Это может также работать в пункте where, что очень удобно для полуавтоматической условных запросов:

where 
    userid = case when @somevar > 0 then 1000 else 1001 end 
1

вы могли бы использовать левое соединение

SELECT 
    u.FullName, a.Address AS Address 
FROM 
    Users u 
    LEFT JOIN Address a ON a.UserID = u.UserID 
WHERE 
    u.UserId = 1000 
3

Я предполагаю, что разница между 1000/1001 является опечаткой. Внешнее соединение должно решить вашу проблему. Если адресов нет, вы все равно получите «FullName» с нулевым адресом.

SELECT 
     u.FullName, a.Address AS Address 
    FROM 
     Users u 
     LEFT OUTER JOIN Address a ON a.UserID = u.UserID 
    WHERE 
     u.UserId = 1000 
1

Внешнее соединение сделает трюк.

SELECT u.FullName, a.Address 
FROM Users u 
LEFT OUTER JOIN Address a ON a.UserId = u.UserId 
WHERE UserId = 1000 
0

Конечно левое соединение является правильным ответом на этот вопрос, кстати, в TSQL вы можете использовать левое соединение более простым способом, используя = *, в вашем случае

 
SELECT u.FullName, a.Address FROM Users u, Address a 
WHERE u.UserId =* a.UserId and u.UserId = 1000 

Peoples поправьте меня: Это синтаксис depredecated в MSSQL (я думаю), и должен быть нИКОГДА, нИКОГДА, нИКОГДА не будет использоваться в производстве pjects :)

BTW, FYI вы можете использовать подзапрос здесь, но это менее recomeded способ

 
SELECT u.FullName, (select a.Address FROM Address a where a.UserId = u.UserId) 
FROM Users u 
WHERE u.UserId = 1000 
+0

Хотя вы подтверждаете правильный ответ и только пытаетесь дать альтернативные ответы, никогда не используйте или даже не пытаетесь узнать о соединениях с _ * = _, это старый синтаксис стиля. –

+0

Никогда не используйте * = или = *, поскольку они не всегда дают правильные результаты, поскольку иногда SQl Server интерпретирует как перекрестное соединение вместо внешнего интерфейса. Это очень плохая практика! Этот синтаксис также устарел.Перед обновлением до следующей версии SQL Server вам необходимо удалить весь свой код. – HLGEM

+0

SOmehow * потерялся в моем последнем комментарии Я имел в виду Никогда не использовать * = или = * не использовать никогда = = = – HLGEM

Смежные вопросы