2017-09-12 12 views
2
select a.AgentId, 
     case(select acs.IsConnected 
      from rmm.tblAgentConnectionStatus acs 
      where acs.AgentName = a.AgentName) 
     when 1 then 'True' 
     when 0 then 'False' 
     when null then 'False' 
     end as ConnectionStatus 
from Sentilan2.rmm.tblAgent a 
order by AgentName asc 

私は上記を持っていますが、対応する行がtblAgentでない場合、ConnectionStatusがnullになります。選択とNullチェックのケース

カラムがnullの場合、結果はFalseになる可能性があります。

電流出力

AgentId         ConnectionStatus 
010D0206-5D8C-4AB1-90B6-7BD0C2773E22 True 
CA4C48DD-3D2E-4948-9F93-254CDF081658 True 
1DB90EE5-D96A-4071-8F51-26B3130EC6D4 NULL 
ACA694D0-0C1D-45BA-80DD-273F41BD70B1 NULL 
941B539B-7CA0-4472-ABCD-2777AE8B2E5D NULL 
1E7DDA4D-C119-4E47-8478-277952024FD1 NULL 

私はそれらのヌルが偽ようにしたいと思います。

答えて

3

あなたはnullに値を代入するcoalesce()またはisnull()を使用することができます。

select a.AgentId, 
     case coalesce((select acs.IsConnected 
      from rmm.tblAgentConnectionStatus acs 
      where acs.AgentName = a.AgentName),0) 
     when 1 then 'True' 
     when 0 then 'False' 
     end as ConnectionStatus 
from Sentilan2.rmm.tblAgent a 
order by AgentName asc 

それともelse 'False'

select a.AgentId, 
     case (select acs.IsConnected 
      from rmm.tblAgentConnectionStatus acs 
      where acs.AgentName = a.AgentName) 
     when 1 then 'True' 
     else 'False' 
     end as ConnectionStatus 
from Sentilan2.rmm.tblAgent a 
order by AgentName asc 
+0

よろしくお願い致します。私は、あなたが '事件 'で' else'をすることができるのか分からなかった.... P.S、侵略者Zimは素晴らしい! – Stuart

+0

@Stuartお手伝いします! – SqlZim

0

あなたはLEFT OUTERは、2つのテーブル間COALESCEでJOINを使用する必要があります。

そのように、あなたがtblAgentから必要なものを取得しますが、偽接続されているがNULLであるかtblAgentConnectionStatus内に対応する行は、私が推薦する

select 
    a.AgentId, 
    case(coalesce(acs.IsConnected, 0)) 
     when 1 then 'True' 
     else 'False' 
    end as ConnectionStatus 
from Sentilan2.rmm.tblAgent a 
left join Sentilan2.rmm.tblAgentConnectionStatus acs 
    on acs.AgentName = a.AgentName 
order by a.AgentName asc 

ことの一つは、AGENTNAMEに参加されていない存在しないところ。それは文字列を比較します。

2つのテーブルの間に整数の外部キーを設定する方が効率的です(参照先のテーブルのプライマリキー)。これにより、特に外部キーを索引付けする場合に、照会が高速になります。

Iはヌル値の正しいテストがis NULLあるthis SQLFiddle link

+0

'case ,,, when null then ... 'は、NULLが等しいかどうかのテストではうまくいきませんので、動作しません。 'Int = NULLとして宣言する@Fooを試してください。 NULLの場合は@Fooを選択し、それ以外の場合は 'oops' end; 'を選択して失敗します。 NULLをテストするには、 'is NULL'を使う必要があります。 – HABO

+0

おっと!これを反映するために私のソリューションを更新してください。私はCOALESCEを使った – jhenderson2099

0

内これを実証しました。残念ながら、case式内の各when句の値を繰り返す必要があります。相関サブクエリを繰り返さないようにするには、さまざまな方法があります。共通テーブル式(CTE)。この場合、left outer joinで十分です。

select a.AgentId, 
     case 
     when acs.IsConnected = 1 then 'True' 
     when acs.IsConnected = 0 then 'False' 
     when acs.IsConnected is null then 'False' 
     else 'Oops: ' + Cast(acs.IsConnected as VarChar(64)) 
     end as ConnectionStatus 
    from Sentilan2.rmm.tblAgent as a left outer join 
    rmm.tblAgentConnectionStatus as acs on acs.AgentName = a.AgentName 
    order by AgentName asc; 

ヒント:任意の予期しない値をキャッチするcase式でelse句を含めることが一般的に良いアイデアです。

ヒント:適切なソフトウェア(MySQL、Oracle、DB2、...)とバージョンの両方でデータベースの質問にタグを付けると便利です。 sql-server-2014。構文と機能の相違は、しばしば答えに影響します。 tsqlは選択肢を絞り込みますが、データベースは指定しません。