2016-08-16 77 views
1

我試着寫在大SQL查詢使用字符串更換URL與

sports.xxxx.com/en-gb/betting/football/vasdas

sports.xxxx.com/en-gb/betting/basketball/blablabla

sports.xxxx.com/en-gb/betting/football/

的中間部分,以取代以下字符串大查詢URL的一部分

sports.xxxx.com/en-gb/betting/golf

所以結果會是

football

basketball

football

golf

我試圖用 SELECT REGEXP_REPLACE('sports.xxxx.com/en-gb/betting/football', '.*', '(?<=\b\/betting\/)(\w+)') 但我得到一個錯誤Error: Invalid string literal: '(?<=\b\/betting\/)(\w+)' 任何想法如何,我能做到嗎?

+0

嘗試'SELECT REGEXP_EXTRACT('sports.ladbrokes.com/en-gb/betting/football',r'(?<?\ b/betting /)\ w +')' –

+0

'錯誤:無法解析正則表達式「(?<= \ b/betting /)\ w +」:無效的perl運算符:(?<' – AlienDeg

+1

Ok,所以,你需要一個帶有REGEX_EXTRACT的捕獲組:'SELECT REGEXP_EXTRACT('spor ts.ladbrokes.com/en-g b/betting/football',r'\ b/betting /(\ w +)' )' –

回答

1

錯誤是由於您在字符串文字中使用的單個反斜槓形成了無效的轉義序列。

你需要一個捕獲組REGEX_EXTRACT

SELECT REGEXP_EXTRACT('spor‌​‌​ts.ladbrokes.com/en‌​-g‌​b/betting/footbal‌​l', r'\b/betting/(\w‌​+)‌​') 

regex demo

還要注意的是大查詢的正則表達式語法由不支持在所有lookarounds的RE2正則表達式庫供電(和你試圖使用積極loobehind (?<=....))。

圖案細節:

  • \b - 字邊界(拖尾)。這可能是不必要的,可以刪除它安全地
  • /betting/ - 文字串/betting/(注意正斜槓是不是特殊的正則表達式,它們不需要轉義)
  • (\w‌​+)‌ - 第1組,字符串的一部分會由REGEX_EXTRACT返回,捕獲一個或多個字符(字母,數字或下劃線)。
1

正則表達式是非常強大且昂貴的特點
如果你有選項來避免傾向於使用更便宜功能的使用它 - 你至少應該嘗試

SELECT 
    SUBSTR(url, 1 + LENGTH('sports.xxxx.com/en-gb/betting/'), 
     INSTR(REPLACE(url + '/', 'sports.xxxx.com/en-gb/betting/', ''), '/') - 1 
) as sport 
FROM 
(SELECT 'sports.xxxx.com/en-gb/betting/football/vasdas' AS url), 
(SELECT 'sports.xxxx.com/en-gb/betting/basketball/blablabla' AS url), 
(SELECT 'sports.xxxx.com/en-gb/betting/football/' AS url), 
(SELECT 'sports.xxxx.com/en-gb/betting/golf' AS url) 

當處理行的巨量,上面的方法可以幫助您避免像資源超時或超時等錯誤(當然取決於您的上述實際查詢的一部分)。您也應該始終保持眼睛在記帳層級上 - 對於昂貴的查詢,這可能會更高,使用正則表達式