天天看點

SAP HANA資料庫中如何使用正規表達式

        作為一個程式員小白,剛進公司上班兩個周,我開始熟悉并參與公司的一個項目(當然,隻是做一些最簡單的查詢來練練手啦,複雜的也不會。。。),帶我的同僚讓我在某個表的資料清單頁面設定幾個按鈕,來根據過期狀态查詢記錄,于是我開始了,這個項目的資料庫是用hana來管理的,裡面有兩張表裡面的截止日期這個字段是varchar(8)類型的日期格式,其中的資料有諸如‘20180101’、‘2018/1/1’、‘00000000’、‘2018-1-1’、‘2018.1.1’、‘2018.01.’、‘’、以及‘0’這樣的資料(後面不對,檢查發現裡面居然還有漢字),我需要把這些不合法的資料都過濾掉,我開始拼接sql語句,發現事情并沒有這麼簡單,因為每個資料庫的語音雖然大緻相同,但是也有一些極小的差異,就比如今天說的正則,在mysql中是用"字段名 REGEXP 正規表達式"來寫的,oracle中是用 "REGEXP_LIKE(字段名,正規表達式)"來寫的,而hana,我找了n多次,也試了n多次,也翻看了無數次hana官方文檔,都沒找到,隻能先用一個又一個的like關鍵字來排除異常資料,直到sql語句有十多行辣麼長(用帶我的同僚說的一句話來形容就是:惡心,我也不想的嘛),功能總算實作了,後來還是我們經理,幫我解決了這個問題,于是,我稍加改造,将又臭又長的sql縮減成了隻有3行的sql,嗯,說了這麼多廢話,還是不如貼代碼:

select * from tb_table1 where enddate like_regexpr '^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))$|^((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[13579][26])00))0229)$'
           

        為什麼會有這麼長的正則呢,這裡補充一下,這個正則是完美比對日期(包括平年閏年、大月小月都考慮進去了),嗯,順便說一句,like_regexpr 這個關鍵字可以同時比對多個正則,看圖:

SAP HANA資料庫中如何使用正規表達式

也就是說,text字段值可以比對this或者them,隻要其中一個比對上,就滿足條件,好了,不多bb了,第一次發部落格,溜了溜了