2017-08-11 1 views
-1

Ich frage mich, wie/wenn ich die Regex verbessern kann, die ich in einer Abfrage verwende. Ich habe eine Reihe von Identifikatoren für bestimmte Benutzergruppen. Sie können in zwei Haupt Format:Regex in Hive QL (RLIKE) - Leistung?

  • X123 oder XY12, (Typ 1)
  • zwei beliebige Buchstaben-Combo, mit Ausnahme von XY (Typ 2)

Typ-1-Gruppen immer sind Länge 4 Es ist entweder der Buchstabe X gefolgt von einer Zahl zwischen 100 und 999 (einschließlich) ODER XY gefolgt von Zahlen zwischen 0 und 99 (auf Länge 2 mit Nullen aufgefüllt).

Gruppen vom Typ 2 sind 2-Buchstaben-Strings mit beliebigem Buchstaben, ausgenommen XY (obwohl meine Abfrage dies nicht angibt).

Der Benutzer kann mehreren Gruppen angehören. In diesem Fall werden verschiedene Gruppen durch ein Rautenzeichen getrennt (#). Hier ein Beispiel:

groups  user  age 
X124  john  23 
XY22#AB mike  33 
AB   peter 21 
X122#XY01 francis 43 

Ich mag Zeilen zählen, in denen mindestens eine Gruppe im zweiten Format angezeigt wird, das heißt, wo Benutzer nicht ausschließlich Mitglied der Gruppen im ersten Format vorliegt.

Ich muss alle Zeilen (d. H. Benutzer) abfangen, die nicht ausschließlich zum ersten Gruppentyp gehören. Im obigen Beispiel möchte ich die Benutzer john und francis ausschließen, da sie nur Mitglieder von Typ 1-Gruppen sind. Auf der anderen Seite ist mike OK, weil er Mitglied der AB-Gruppe (d. H. Gruppe von Typ 2) ist.

Ich mache es derzeit wie folgt aus:

select 
    count(*) 
from 
    users 
where 
    groups not rlike '^(X[Y1-9][0-9]{2,2})(#X[Y1-9][0-9]{2,2})*$' 

Ist das schlechte Leistung klug? Und wie sollte ich es beheben?

+0

Ihre Frage könnte hier besser tun: https://codereview.stackexchange.com/ –

+0

@JimSimson Ich bin cool w/das - nur nicht wissen, wie/wenn ich kann, um es zu bewegen – hummingBird

+0

Ich sage nicht unbedingt, dass es hier falsch ist, ich möchte vielleicht auch dort drüben posten. –

Antwort

1

Ich möchte Zeilen zählen, in denen mindestens eine Gruppe im zweiten Format erscheint.

Es scheint ein wenig einfacher dann where groups like zu wählen:

\b(?:(?!XY)[A-Z]{2})\b 

\b ist eine Wortgrenze. Es nimmt kein Zeichen auf, sondern gibt an, dass dort kein nicht-alphanumerisches Zeichen stehen darf.

Live demo.

+0

Sie schließen AY in Ihrem Beispiel aus. Ihr hättet AY gefangen. Ansonsten sieht es einfacher aus. – hummingBird

+1

Sie haben 'jede Zwei-Buchstaben-Kombination angegeben, solange die zweite nicht Y ist (Typ 2)'. Ich habe die Demo für 'Gruppe 2 schließt XY' aktualisiert: https://regex101.com/r/EZRsuZ/2 – linden2015

+0

nun, es war eine Bearbeitung .. meine schlechte. Ich habe einige Änderungen hinzugefügt, aber ich werde auch die Gruppenbeschreibung korrigieren. – hummingBird