MySQL Benutzernamen

Coach

Aktives Mitglied
Hallo, ich suche eine Möglichkeit, mir die Benutzernamen auszugeben, die nicht mit den buchstaben a-z beginnen.
hab es so probiert:

SELECT USER_EMAIL FROM system_user_data AS a LEFT JOIN system_user AS b ON a.USER_ID = b.USER_ID WHERE USER_NAME NOT BETWEEN 'A%' AND '%Z' ORDER BY USER_NAME

hat aber nicht geklappt.
kann mir da jemand weiterhelfen?
 
CODE SELECT USER_EMAIL FROM system_user_data AS a LEFT JOIN system_user AS b ON a.USER_ID = b.USER_ID WHERE SUBSTRING( USER_NAME, -1*LENGTH(USER_NAME), 1 ) NOT REGEXP '^[a-z]' ORDER BY USER_NAME


nicht getestet sollte aber funktionieren
wink.gif


ps: sollte die spalte case sensitve sein solltest du noch was ändern (soweit ich mit der vermutung richtig liege, dass du alles auswählen willst, was nicht mit a-z und auch nicht mit A-Z beginnt)

CODE SELECT USER_EMAIL FROM system_user_data AS a LEFT JOIN system_user AS b ON a.USER_ID = b.USER_ID WHERE SUBSTRING( USER_NAME, -1*LENGTH(USER_NAME), 1 ) NOT REGEXP '^[a-zA-Z]' ORDER BY USER_NAME
 
QUOTE (Coach @ Fr 25.07.2008, 12:46)SELECT USER_EMAIL FROM system_user_data AS a LEFT JOIN system_user AS b ON a.USER_ID = b.USER_ID WHERE USER_NAME NOT BETWEEN 'A%' AND '%Z' ORDER BY USER_NAME

Der Between-Operator akzeptiert keine Wildcards, wie das der Like-Operator macht.

Also liefert


CODE Between 'A' And 'Z'


alle Einträge, die mit einem Buchstaben beginnen.

'%' hat den Unicode-Codepunkt 37, A = 65, Z = 90.

Mit


CODE BETWEEN 'A%' AND '%Z'


kriegst Du alles, was mit Zeichen größergleich A und kleinergleich '%' beginnt - also gar nichts. '%' wird hier gemäß seines Codepunktes interpretiert, nicht als Wildcard. Und einen Codepunkt größergleich 65 und kleinergleich 37 gibt es nun mal nicht.

Die Verneinung dafür liefert fast alles - alle Einträge, die nicht Null sind. Letzteres gilt zumindest für Standard-Sql. Da ich ja neulich bei dem Group By gelernt habe, daß sich mySql nicht immer unbedingt an den Standard hält, weiß ich aktuell nicht, ob das da auch gilt.

Ergebnis:


CODE Not Between 'A' And 'Z'


ist im Prinzip der richtige Ansatz, wobei eine Sortierung definiert sein muß, die Groß/Kleinschreibung ignoriert. Und das sollte auch sehr viel schneller gehen als die Nutzung eines RegEx. Der Between-Operator berücksichtigt normalerweise auch Indices.
 
Ich weiss auch nicht, ob die Daten case-sensitv sind.
Sonst probier einfach mal:

SELECT USER_EMAIL FROM system_user_data AS a LEFT JOIN system_user AS b ON a.USER_ID = b.USER_ID WHERE LEFT(LCASE(USER_NAME),1)<'a' or LEFT(LCASE(USER_NAME),1)>'z' ORDER BY USER_NAME

Grüsse

Tümmel
 
ahja, ich hab das jetzt verstanden und werds morgen direkt ausprobieren.. danke euch beiden!
 
Zurück
Oben