2009-08-28 8 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 

一致が見つからない場合、これはaddressの列のすべてのnullを返します。

しかし、より一般的な意味であなたの質問に答えるために、あなたは全体のwhoopla持ってすることを避けるために、あなたのクエリ内case statementを使用することができます。

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をSQLでswitch文ですので、あなたこれを行うことができます。

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

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

人々が私を修正し、あなたの場合には、= *使用して、左使うより簡単な方法で参加することができところでTSQLで、この質問に対する正しい答えである:これは、構文

をMSSQLにdepredecated(私は思う)と、生産pjectsで使用されることはありませんNEVER NEVERする必要があります:)

ところで、FYIあなたがここに副選択を使用することができますが、それより少ないrecomeded方法0

+0

あなたは正しい答えを確認して、代わりの回答を出そうとしていますが、_ * = _を使って結合を学習したり試したりしてはいけませんが、それは古いスタイルの構文です。 –

+0

SQl Serverが外部結合の代わりにクロス結合として解釈する場合があるため、必ずしも正しい結果を得られないので、* =または= *を使用しないでください。これは非常に貧しい習慣です!この構文も廃止予定です。次のバージョンのSQL Serverにアップグレードする前に、すべてのコードを削除する必要があります。 – HLGEM

+0

それは*最後のコメントで失われてしまったことを意味していませんでした* =または= *使用しないでください – HLGEM

関連する問題