TSQL, как избежать условий? - PullRequest
2 голосов
/ 28 августа 2009

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

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

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

Ответы [ 5 ]

4 голосов
/ 28 августа 2009

В этом конкретном случае вам лучше использовать left объединение :

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

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

Однако, чтобы ответить на ваш вопрос в более общем смысле, вы можете использовать case выражение в своем запросе, чтобы избежать необходимости иметь целый 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
3 голосов
/ 28 августа 2009

Я предполагаю, что разница между 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 голос
/ 28 августа 2009

Внешнее соединение поможет.

SELECT u.FullName, a.Address
FROM Users u
LEFT OUTER JOIN Address a ON a.UserId = u.UserId
WHERE UserId = 1000
1 голос
/ 28 августа 2009

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

SELECT 
   u.FullName, a.Address AS Address
FROM 
   Users u
   LEFT JOIN Address a ON a.UserID = u.UserID
WHERE 
   u.UserId = 1000
0 голосов
/ 28 августа 2009

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

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

Люди поправляют меня: этот синтаксис устарел в MSSQL (я так думаю) и его НИКОГДА, НИКОГДА, НИКОГДА не следует использовать в рабочих проектах:)

Кстати, к вашему сведению, вы можете использовать подпункт, но он менее рекомендуемый способ

SELECT u.FullName, (select a.Address FROM Address a where a.UserId = u.UserId) 
FROM Users u
WHERE u.UserId = 1000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...