2011-08-19 6 views
0

これを簡単にしましょう。case statement logic

私はテーブルを持っています。

visitID studentname  dob  roll.no  value displIndex  propID 
200019  rob   05/18/1937  101  smoking  2    83 
200019  rob   05/18/1937  101     2    91 
200019  rob   05/18/1937  101  alcohol  1    83 
200019  rob   05/18/1937  101     1    91 
200020  henry  08/20/1987  102  smoking  2    83 
200020  henry  08/20/1987  102     2    91 
200021  king  09/21/1982  103  alcohol  1    83 
200021  king  09/21/1982  103     1    91 

私は似たような種類の表を持っています。

今私がしようとしているのは、その特定のvisitIDの学生の表示インデックスが1つもない場合、case文では'779'の値を返します。

select visitID,studentname 
     ,dob 
     ,roll.no 
     ,value 
     ,dispIndex 
     ,propID 
     ,case 
      WHEN (PATINDEX('%smoking%',value) >0 OR 
        (PATINDEX('%sometimes smoking%',value) > 0) THEN 
         '777' 
       WHEN (PATINDEX(%not smoking%,value) >0 OR 
        (PATINDEX(%do not smoke%,value) >0_ THEN 
          '778' 
      WHEN (ISNULL(CAST(value as varchar(max)),'')='') THEN 
          '779' 
       ELSE 
          '779' 
      END VALUE 

ここにキングは喫煙中の記録を持っていません。だから私はそれを779バケツに入れて欲しい。私はそれをどのように行うことができますか?

+2

習慣がフリーテキストの場合、[データ変更の異常](http://en.wikipedia.org/wiki/Database_normalization#Free_the_database_of_modification_anomalies)があります。あなたが望むものはどちらかとは分からない。初心者のためにフィールド間のフィールドの関係を見ることができません – gbn

+1

また、いくつかのサンプル出力は良いです。また、**あなたのサンプルクエリでキーワードを間違って入力すると、あなた自身の努力で多くの注意を払うことはありません!** – JNK

+1

's.value'とは何ですか?また、' CASE '声明? – Lamak

答えて

0

ないのはなぜあなたは(あなたのサンプルデータに基づいて)ここにキャストをやっていることを確認するため、この変更:これに

WHEN (ISNULL(CAST(value as varchar(max)),'')='') THEN '779' 

:また

WHEN ISNULL(value,'') = '' THEN '779' 

を - という方法を実現あなたはワイルドカードをやっていますが、最初のパターン(PATINDEX('%smoking%',value)と一致するので、あなたの「禁煙」の値はすべて「777」になります(つまり、2番目のパターンはチェックされません)。

EDITコメントでご質問
答え:


1)がどのようにそれが王の記録を引っ張ってくる - >喫煙 - > displayIndex 2を?
回答:Kingのサンプルセットにdisplayindexが2のレコードがありません。そこにないレコードは取得できません。

2)アルコール記録を確認したい。
回答:すでに喫煙者&の禁煙者の問題を解決しました。 alchoholのために同じようなことをしてください。例えば:彼は次のとおりです。WHEN PATINDEX('%alchohol%',value) > 0 THEN '779'

3)私は779
回答の下で王の学生を置くしたいと思います。 CASEの文が動作する方法では、WHENの条件のいずれもがtrue(つまり、...WHEN PATINDEX('%smoking%',value) > 0)に評価されない場合、ELSEステートメントが使用されます。 WHENステートメントのどれもがキングのためにtrueと評価されないので、彼は779になります。

+0

どのようにそれは王のレコードを引き出す - >喫煙 - > displayIndex 2?喫煙中の王の記録がないときは?私は、喫煙歴とアルコール記録のすべての生徒をチェックしたいと思います。今や王は喫煙していないアルコールだけを再ードコートしました。私は779の下に王の学生を入れたいと思います。 – palum

+0

あなたの質問を少し難解にしていますが、私の修正された答えを見てください。あなたはまだキングが779歳未満ではないと思ったら、どうしてあなたがそう思うかを述べてください。 – Chains

+0

私はアルコールと喫煙ですべての生徒の記録を引き出す必要があります。彼らはそれを持っているかどうかにかかわらず。上記の場合、あなたは王が喫煙を記録していないことがわかります。私は王のロールがないか、訪問IDが779バケツに行きたい。 – palum