8

OrderBy というフラグが 1 の場合、それはカレンダー イベントであり、2 つの日時フィールド間の範囲を確認する必要があるというクエリがあります。他のすべてのタイプは、あなたが見ている日をチェックするだけです。if ステートメントを調査したところ、ケースの使用が提案されている多くの投稿を見たので、それをクエリに実装しようとしました。私のクエリには、where の条件が必要です。私は構文の問題があることを知っています。そのため、誰かがこれを行う正しい方法を指摘できることを期待してここにいます。

お時間をいただきありがとうございます

現在の私のクエリ

SELECT          activities.*, 
                activitytypes.orderby 
FROM            activities 
LEFT OUTER JOIN activitytypes 
ON              activities.typeid = activitytypes.typeid 
WHERE           activities.userid = 86 
AND             activities.typeid NOT IN ( 5, 
                                          10, 
                                          11, 
                                          12, 
                                          19 ) 
AND 
                CASE 
                                WHEN activities.orderby = 1 THEN activities.starttime >= '2013-08-26 04:00:00' 
                                AND             activities.endtime <= '2013-08-27 04:00:00' 
                                ELSE activities.activitydate = '2013-08-26' 
                                order BY        activitytypes.orderby, 
                                                activities.starttime
4

1 に答える 1

26

十分な括弧を使用する限り、これを行うことができますANDOR

activities.OrderByまた、それはnullになる可能性があると想定しています。そうでない場合は、null チェックを削除できます。

SELECT activities.*, 
       activitytypes.orderby 
FROM   activities 
       LEFT OUTER JOIN activitytypes 
                    ON activities.typeid = activitytypes.typeid 
WHERE  activities.userid = 86 
       AND activities.typeid NOT IN ( 5, 10, 11, 12, 19 ) 
       AND ( ( activities.orderby = 1 
               AND activities.starttime >= '2013-08-26 04:00:00' 
               AND activities.endtime <= '2013-08-27 04:00:00' ) 
              OR ( ( activities.orderby IS NULL 
                      OR activities.orderby != 1 ) 
                   AND activities.activitydate = '2013-08-26' ) ) 
ORDER  BY activitytypes.orderby, 
          activities.starttime 

または、引き続き を使用する場合は、次のようにを使用してステートメントをCASE閉じる必要があります。CASEEND

SELECT          activities.*, 
                activitytypes.orderby 
FROM            activities 
LEFT OUTER JOIN activitytypes 
ON              activities.typeid = activitytypes.typeid 
WHERE           activities.userid = 86 
AND             activities.typeid NOT IN ( 5, 10, 11, 12, 19 ) 
AND             ( 
                  CASE 
                  WHEN activities.orderby = 1 THEN
                    activities.starttime >= '2013-08-26 04:00:00' AND activities.endtime <= '2013-08-27 04:00:00'
                  ELSE
                    activities.activitydate = '2013-08-26' 
                  END
                ) 
ORDER BY        activitytypes.orderby, 
                activities.starttime
于 2013-08-26T19:13:12.457 に答える