2017-01-23 13 views
3

次のコードを変更して、[execution_status](「失敗」など)と同時に[has_messages](「0」など)のレコードを抽出する方法を教えてください。私はさまざまな方法をしようとしているし、すべての時間の結果は、両方の「0」と「1」has_messagesを含め:(このことについてたくさんありがとう!!比較演算子を組み合わせる

SELECT * 
FROM (SELECT [id] 
      ,[type] 
      ,[created] 
      ,dateadd(s, created/1000, '19700101')as date_created 
      ,[state] 
      ,[execution_status] 
      ,[has_messages] 
     FROM [databasename].[tablename] 
     WHERE type like 'AccessRequest' 
     AND not state like 'Initialize') as jaro 
WHERE date_created between '2016-12-01' and '2016-12-31' 
ORDER by date_created 
+0

サンプルデータと予想される出力を表示できますか? –

+2

サンプルデータと期待される出力を見せてください。 \t [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [**スタート**] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を改善し、より良い回答を得る方法を学ぶことができます。 –

+0

なぜ「LIKE」を使用しますか?あなたのために働かないのですか? –

答えて

0

方法:ここでは

SELECT * 
FROM (SELECT 
       id 
       ,type 
       ,created 
       ,dateadd(s, created/1000, '19700101') AS date_created 
       ,state 
       ,execution_status 
       ,has_messages 
     FROM databasename.tablename 
     WHERE (type = 'AccessRequest' 
     AND state != 'Initialize') 
      OR (execution_status = 'failure' 
     AND has_messages = 0) 
    ) AS jaro 
WHERE date_created >= '2016-12-01' <= '2016-12-31' 
ORDER BY date_created 
+0

サブクエリをどこで閉じますか?なぜ日の条件を繰り返すのですか? –

+0

あなたのサブクエリを見逃してしまいました、私に修正をさせてください。 – dadde

+0

私は決して心配しないでください。今度はOR条件をカバーする別のカッコを追加する必要があります –

3

があります提案の束まず、私は日付の計算列を持つようにテーブルを変更します:。

alter table tablename add date_created as (dateadd(second, created/1000, '19700101')); 

これは、クエリを高速化することができ、列にインデックスを上に追加できるようになるその後、あなたは修正する必要があります。あなたの日付比較(Aaronベルトランの優れた解説What do BETWEEN and the Devil Have In Common?):

select t.* 
from tablename t 
where (date_created >= '2016-12-01' and date_created < '2017-01-01') and 
     ((type like 'AccessRequest' AND state not like 'Initialize') or 
     (execution_status like 'failure' and has_messages like '0') 
    ) 

追加コメント:

  • が数値のように使用しないでください。 has_messagesが数字の場合は、単に=を使用してください。
  • ですが、文字列の比較にlikeを使用すると、多くの人が=が意図的に明確になることに同意します。
  • has_message0ではないこれらの行が元の条件を満たすため、このクエリでは値が取得されます。
関連する問題