2016-08-16 4 views
1

Ich versuche, SQL in großer Abfrage zu schreiben mit mittlerem Teil der ZeichenfolgeErsetzen URL mit einem Teil dieser URL in Big Abfrage

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

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

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

zu ersetzen Saiten unten

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

Also Ergebnis wäre

football

basketball

football

golf

Ich versuchte SELECT REGEXP_REPLACE('sports.xxxx.com/en-gb/betting/football', '.*', '(?<=\b\/betting\/)(\w+)') zu verwenden, aber ich erhalte eine Fehlermeldung Error: Invalid string literal: '(?<=\b\/betting\/)(\w+)' Irgendwelche Ideen, wie ich es machen kann?

+0

Versuchen Sie es 'SELECT REGEXP_EXTRACT (' sports.ladbrokes.com/de-de/betting/football ', r' (?<= \ b/wetten /) \ w + ') ' –

+0

' Fehler: Fehler beim Parsen des regulären Ausdrucks "(? <= \ b/betting /) \ w +": ungültiger Perl-Operator: (? <' – AlienDeg

+1

Ok, Also, Sie brauchen eine einfangende Gruppe mit 'REGEX_EXTRACT':' SELECT REGEXP_EXTRACT ('spor ts.ladbrokes.com/en-g b/wetten/football', r '\ b/wetten/(\ w +)') ' –

Antwort

1

Der Fehler ist auf die einzelnen umgekehrten Schrägstriche zurückzuführen, die Sie im Zeichenfolgenliteral verwendet haben, die ungültige Escape-Sequenzen bildeten.

Sie brauchen eine Erfassungsgruppe mit REGEX_EXTRACT:

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

den See regex demo

Beachten Sie auch, dass Big Abfrage regex Syntax von der RE2 regex Bibliothek mit Strom versorgt wird, die lookarounds überhaupt nicht (und Sie unterstützen versucht, einen positiven Loobbehind zu verwenden (?<=....)).

Die Musterdetails:

  • \b - eine Wortgrenze (nachgestellt). Es könnte überflüssig sein, können Sie es sicher entfernen
  • /betting/ - eine wörtliche Teilzeichenfolge /betting/ (man beachte die Vorwärts-Schrägstriche für regex nicht speziell sind, brauchen sie kein Entkommen)
  • (\w‌​+)‌-1 Gruppe, die Teil der Zeichenfolge das wird von der REGEX_EXTRACT zurückgegeben werden, erfassen 1 oder mehr Wort Zeichen (Buchstaben, Ziffern oder Unterstriche).
1

Regular Expression ist extrem leistungsstarke und dennoch teuer Funktion
Wenn Sie die Option haben, verwenden sie für den Einsatz von billigeren Funktionen zu vermeiden - sollten Sie zumindest

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) 

Bei der Verarbeitung von großen Menge an Zeilen versuchen, Der obige Ansatz kann Sie vor Fehlern wie Ressourcenüberschreitung oder Timeout usw. schützen (hängt natürlich von der tatsächlichen Abfrage ab, die Sie oben haben). Außerdem sollten Sie immer die Abrechnungsebene im Auge behalten, die bei teuren Abfragen mit regexp möglicherweise höher sein kann.