我有每月或每年或兩者都更新的產品串列。如果續訂值為“M”,則產品按月續訂。如果更新值為“Y”,則產品每年更新一次。
所以我的查詢是,如果我選擇方法(M/Y)和特定日期(P_date),我想要有資格續訂的產品的詳細資訊。
例如:
P_no start_date renewal_date end_date
1001 01-01-2022 01-02-2022 31-01-2022
1002 01-01-2022 01-01-2023 31-12-2022
如果我選擇P_dateas06-01-2022和renewas MthenP_no 1001應該選擇
如果我選擇P_dateas06-01-2022和renewas AthenP_no 1002應該選擇
我寫了下面的查詢
select * from products
where P_no in('1001','1002') and
CASE renew
WHEN renew = 'M' and round(months_between(renewal_date,start_date)) = 1 then
TO_CHAR(TO_DATE (P_date,'DD-MM-YYYY'),'DD-MON-YYYY') BETWEEN start_date AND end_date
WHEN renew='Y' and round(months_between(renewal_date,start_date)) = 12 then
TO_CHAR(TO_DATE (P_date,'DD-MM-YYYY'),'DD-MON-YYYY') BETWEEN start_date AND end_date
end ;
并得到錯誤:
缺少關鍵字
我究竟做錯了什么?
uj5u.com熱心網友回復:
您正在嘗試根據 case 運算式更改應用于查詢的條件,但這是行不通的;您可以將評估結果設為 0/1 并與 than 進行比較,但這只會使其更難閱讀。
相反,只需對整個事情使用布爾邏輯;假設renew只能是 M 或 Y 那么也許:
select * from products
where P_no in('1001','1002') and
(
(
renew = 'M' and round(months_between(renewal_date,start_date)) = 1 and
TO_CHAR(TO_DATE (P_date,'DD-MM-YYYY'),'DD-MON-YYYY') BETWEEN start_date AND end_date
)
or
(
renew='Y' and round(months_between(renewal_date,start_date)) = 12 and
TO_CHAR(TO_DATE (P_date,'DD-MM-YYYY'),'DD-MON-YYYY') BETWEEN start_date AND end_date
)
);
也許:
select * from products
where P_no in('1001','1002') and
(
(renew = 'M' and round(months_between(renewal_date,start_date)) = 1)
or
(renew='Y' and round(months_between(renewal_date,start_date)) = 12)
)
and TO_CHAR(TO_DATE (P_date,'DD-MM-YYYY'),'DD-MON-YYYY') BETWEEN start_date AND end_date;
盡管無論哪種方式,您的轉換p_date看起來都很奇怪。如果那是日期資料型別(如果可能的話,應該是這樣),那么只需執行以下操作:
P_date BETWEEN start_date AND end_date
如果它是一個字串,則將其轉換為日期,但不要再次轉換為字串:
TO_DATE (P_date,'DD-MM-YYYY') BETWEEN start_date AND end_date
當然,這假設start_date并且end_date也是日期。如果它們是字串(它們不應該是),則P_date不需要進行轉換,但是對于您正在查看/使用的格式,比較不會像您期望的那樣作業。
uj5u.com熱心網友回復:
您的案例陳述不正確。要么你做這樣的事情:
CASE
WHEN renew = 'M'
要么
CASE renew
WHEN 'M'
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442075.html
