2016-05-06 10 views
1

件数のあるメッセージの一覧を含むテーブルがあります。 0は、すべてのメッセージが読み取られることを意味し、Count> 0は、n個の未読メッセージがあることを意味します。私は、読み込みレコード、未読レコード、または両方のステータスタイプ( '読み取り'、 '未読'、 '両方')のレコードを取得したいと思います。私もこのSQLクエリを試してみましたSQL Server 2008 R2のwhere句での比較演算子の使用

DECLARE @Status VARCHAR(10) 
SET @Status = 'ALL' 
SELECT * 
FROM Messages 
WHERE 
    (UPPER(@Status) = 'READ' AND UNREAD = 0) 
    OR (UPPER(@Status) = 'UNREAD' AND UNREAD > 0) 
    OR (UNREAD >=0) 
    ) 

:私は次のSQLクエリを使用しています

DECLARE @Status VARCHAR(10) 
SET @Status = 'ALL' 
SELECT * 
FROM Messages 
WHERE 1 = (
    CASE WHEN UPPER(@Status) = 'READ' AND UNREAD = 0 THEN 1 
     WHEN UPPER(@Status) = 'UNREAD' AND UNREAD > 0 THEN 1 
     WHEN UPPER(@Status) = 'ALL' AND UNREAD >= 0 THEN 1 
     ELSE 0 
    END 
    ) 

しかしたびに、返された結果セットには、カウント> 0何があるレコードのみが含まれています私は間違っている?

テーブルの構造は次のようである:

ChatGroupId  Unread 
--------------------------- 
     1    0  --When all messages are read 
     2    50  --When some of the messages are unread 

出力は次のようになります。

@status = 'READ'

ChatGroupId  Unread 
--------------------------- 
     1    0  --When all messages are read 

@status = 'UNREAD'

ChatGroupId  Unread 
--------------------------- 
     2    50  --When some of the messages are unread 

場合は@status = 'ALL'

ChatGroupId  Unread 
--------------------------- 
     1    0  --When all messages are read 
     2    50  --When some of the messages are unread 
+1

を試す(および/または下さいSQLのフィドル) - 私はあなたがこれをかなり複雑にしている疑いがありますが、追加情報なしで確かめるのは難しいです。 –

+0

が更新されました。確認してください –

答えて

1

あなたが何かを試みることができる:検索文字列が@Status = 'READ'と列の値UNREAD = 0それを選択する場合は

SELECT * 
FROM Messages 
WHERE 
    (UPPER(@Status) = 'READ' AND UNREAD = 0) 
    OR (UPPER(@Status) = 'UNREAD' AND UNREAD > 0) 
    OR (UPPER(@Status) = 'ALL') 

をすべての行はUNREAD = 0です。

検索文字列@Status = 'UNREAD'ザッツはあなたが列UNREADのすべての未読メッセージがどこ値を選択したい場合は意味>0

それ以外のすべての行'READ'を取得したいと'UNREAD'場合@Status = 'ALL'場合は、チェックすることができそして何のケアがUNREAD列にどのような値をできなくなりますので、あなたは、もはや列UNREADをチェックする必要はありません。

+1

はい、これは動作します。ありがとう:) –

+0

私のコードがうまくいかなかった理由を説明してください。 –

+0

@Alorikaは私の答えをいくつかの説明で更新しました。 –

-1

ない場合..

は "> = 0" を削除

..あなたは追加の列が読まれている場合、この1

DECLARE @Status VARCHAR(10) 
SET @Status = 'ALL' 
SELECT * 
FROM Messages 
WHERE 1 = (
    CASE WHEN UPPER(@Status) = 'READ' AND READ = 0 THEN 1 
     WHEN UPPER(@Status) = 'UNREAD' AND UNREAD > 0 THEN 1 
     WHEN UPPER(@Status) = 'ALL' AND UNREAD >= 0 and read>=0 THEN 1 
     ELSE 0 
    END 
    ) 

が..あなたが上記のいずれかに行くことができます試してみてくださいすべてで、あなたが私たちのテーブル構造、いくつかのサンプルデータと予想される出力を示している場合、それが役立つだろう。この

WHERE 
    (UPPER(@Status) = 'READ' AND UNREAD = 0) 
    OR (UPPER(@Status) = 'UNREAD' AND UNREAD > 0) 
    OR (UPPER(@Status) = 'ALL') 
+0

'read'のような列名はありません。 –

+0

@Adiなぜあなたはコピーしましたか?私の答えは編集後に貼り付けられましたか? –

+0

@ StanislovasKalašnikovas..申し訳ありません..私はあなたの答えを確認していない.. – Adi

関連する問題