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.