RATES_ALL.EFFECTIVE_DATEの日付は日付だけですか、それとも時間もありますか?次のようなものが必要になる場合があります。
SELECT RATE, EFFECTIVE_DATE
FROM RATES_ALL
WHERE EFFECTIVE_DATE IN
CASE
WHEN TRIM(TO_CHAR(add_months(&&EFF_DATE, -5), 'DAY')) = 'SATURDAY'
THEN
(
SELECT MAX(EFFECTIVE_DATE)
FROM RATES_ALL
WHERE TRUNC(EFFECTIVE_DATE) = add_months(&&EFF_DATE, -5)-1
)
END;
編集:
さて、これがあなたのコードが機能しない理由です:
ドキュメントによると、DAY形式のモデルは「この要素に使用される日付言語で最も広い日の名前の幅を表示するために空白が埋め込まれた日の名前」です。したがって、TO_CHAR関数参照の出力は実際には「SATURDAY」です(最後のスペースに注意してください)。WHEN句でTO_CHAR関数の出力をTRIMする必要があります(編集されたクエリについては上記を参照してください)。
また、MAXなどのCASEステートメントで単一の行を返すには、SELECTに集計関数が必要です。
再テスト:
WITH rates_all AS
(SELECT TO_DATE('05/31/2012','MM/DD/RRRR') effective_date, 1 rate from dual
UNION
SELECT TO_DATE('12/30/2011','MM/DD/RRRR'), 2 FROM dual
UNION
SELECT TO_DATE('12/30/2011','MM/DD/RRRR'), 3 FROM dual)
SELECT RATE, EFFECTIVE_DATE
FROM RATES_ALL
WHERE EFFECTIVE_DATE IN
CASE
WHEN TRIM(TO_CHAR(add_months(TO_DATE('05/31/2012','MM/DD/RRRR') , -5), 'DAY')) = 'SATURDAY' THEN
(SELECT MAX(EFFECTIVE_DATE)
FROM RATES_ALL
WHERE TRUNC(EFFECTIVE_DATE) =
add_months(TO_DATE '05/31/2012','MM/DD/RRRR') , -5)-1)
END;
RATE EFFECTIVE_DATE
---------- --------------
2 12/30/2011
3 12/30/2011