2016-04-24 1 views
0

現在、曜日に応じて実行する必要のある2つの異なるSQLスクリプトがあります。私はそれらを1つにまとめる方法を見つけようとしており、それが何曜日になっているかをチェックし、それに基づいて適切な変更を実行するロジックを持っています。曜日によってANDを使用するSQL文

だから、基本的な構造は次のとおりです。

SELECT * FROM table 
WHERE foo = 'bar' 
AND foo2 = 'bar2' 
AND foo3 = 'bar3'; 

唯一の違いは、それは月曜日の場合で、例1を変更する必要があります。

だから私は必要な擬似コードは次のようになります。

SELECT * FROM table 
WHERE foo = 'bar' 
AND foo2 = 'bar2' 

if day = 'Monday' then 
AND foo3 = 'bar3' 
else 
AND foo3 = 'bar3a'; 

任意のアイデア?私はthisに基づいてケースセレクトを組み込もうとしましたが、うまくいかなかったのです。

ありがとうございます!

答えて

3

私は正しいロジックがあると思う:

WHERE foo = 'bar' AND 
     foo2 = 'bar2' 
     ((TO_CHAR(SYSDATE, 'Dy') = 'Mon' AND foo3 = 'bar3')) OR 
     (TO_CHAR(SYSDATE, 'Dy') <> 'Mon' AND foo3 = 'bar3a') 
    ) 

二つの重要な考慮事項:

  • これは月曜日ではなく、月曜日の両方をチェックします。
  • フルネームではなく、略語を使用します。オラクルは日付の名前をパッドするため、結果は'Monday'ではなく、'Monday 'となり、スペースが違います。
  • Thorsteinが言及しているように、第3引数の'NLS_DATE_LANGUAGE=AMERICAN'を追加して、結果が英語になるようにすることができます。
+0

ありがとう!それは完全に動作しているようです!また、ありがとう、私は完全にOracleの時代の詰め物を忘れていました。 – SS113

+1

良い答え。しかし、セッションの設定に依存しないように、名前を使って作業するときは明示的に言語を指定する必要があります: 'TO_CHAR(SYSDATE、 'Dy'、 'NLS_DATE_LANGUAGE = AMERICAN')'。 –

1

case式は値を返します。 where節の質問に記載されているように使用することはできません。

andorを使用して条件を表現します。

SELECT * FROM table 
WHERE foo = 'bar' 
AND foo2 = 'bar2' 
AND (
    (TO_CHAR(SYSDATE, 'Day') = 'Monday' AND foo3 = 'bar3') OR foo3 = 'bar3a' 
    ) 
+0

クイックレスポンスをいただきありがとうございます。デモ従業員テーブルでこのコードを使用していくつかの例を試してみましたが、何らかの理由で、設定した曜日に関係なく常にOR側が選択されます。従って: 'SELECT * FROM emp ここでJOB = 'MANAGER' AND((TO_CHAR(SYSDATE、 'Day')= '日曜日' AND COMM = 3)OR COMM = 7);' = 7 – SS113

関連する問題