今天開發CRM的一個小功能,需求大概是這樣的:
有一張存儲客戶信息的表,這個表中有一個列代表著該用戶的“提醒時間”,它意為:如果當前時間大于等于這個值,那么該用戶就需要在展示的時候被標記為“需要提醒”,并且需要展示需要提醒的條數。
其實這個問題不應該是個大問題,只不過本人oracle比較薄弱,需要進行記錄,以便后查。
經過調查,我發現了如下幾個函數對于實現本需求有幫助::
1:符號判斷函數 sign
函數語法:
sign(n)
函數說明:
取數字n的符號,大于0返回1,小于0返回-1,等于0返回0
示例:
一、select sign( 100 ),sign(- 100 ),sign( 0 ) from dual;
SIGN(100) SIGN(-100) SIGN(0)
———- ———- ———-
1 -1 0
二、a=10,b=20
則sign(a-b)返回-1
2:值比較函數 decode
函數說明:
根據條件返回相應值
示例:
decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)
該函數的含義如下:
IF 條件=值1 THEN
RETURN(翻譯值1)
ELSIF 條件=值2 THEN
RETURN(翻譯值2)
......
ELSIF 條件=值n THEN
RETURN(翻譯值n)
ELSE
RETURN(缺省值)
END IF
或:
when case 條件=值1 THEN
RETURN(翻譯值1)
ElseCase 條件=值2 THEN
RETURN(翻譯值2)
......
ElseCase 條件=值n THEN
RETURN(翻譯值n)
ELSE
RETURN(缺省值)
END
感覺這兩個函數就足夠了,那么現在理清楚寫sql的思路:
比較每條記錄的“提醒時間”,過期或者到期就意味著需要設置提醒。
1:先比較兩個時間表:crm_lwh_custinfo
字段:remind_date(Date)
1 sign(to_date(t.remind_date,'yyyy.mm.dd')-to_date(sysdate,'yyyy.mm.dd'))
根據sign函數的返回值進一步設置sql要返回的值
2:根據sign函數的返回值,通過decode函數設定sql要返回的值
過期或者到期都用1標識,未到期,也就是默認值用0標識
1 select decode(sign(to_date(t.remind_date,'yyyy.mm.dd')-to_date(sysdate,'yyyy.mm.dd')),-1,1,0,1,0)
as need_remind from crm_lwh_custinfo t
如果你看到這里覺得有什么更好的辦法,或者覺得這種寫法有什么不足,歡迎留言。