Kann ich MySQL-Enums vergleichen?

8

Ich habe eine Aufzählung: ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' )

Wenn ich meine Tabelle nach dieser Spalte sortiere, erhalte ich sie in der oben definierten Reihenfolge.

Ich kann jedoch keinen Weg finden, eine Teilmenge von diesen auszuwählen, z. alles vor dem Delta. Die Verwendung von WHERE status < 'delta' gibt nur Alpha und Beta zurück, nicht Gamma. Es sieht so aus, als ob MySQL einen String-Vergleich verwendet, nicht einen Enum-Index-Vergleich.

Ich könnte die Indexzahlen verwenden - also WHERE status < 4 - aber es ist ein bisschen ein Code-Geruch (magische Zahlen) und kann brechen, wenn ich neue Werte in die Aufzählung einfüge.

    
DisgruntledGoat 16.11.2008, 23:25
quelle

5 Antworten

7

Sie versuchen, Datenbearbeitungsmethoden für Metadaten zu verwenden, und das ist sicher umständlich.

Dies ist ein guter Grund, das ENUM durch einen Fremdschlüssel in einer Nachschlagetabelle zu ersetzen. Dann können Sie herkömmliche Datenmanipulationstechniken verwenden.

    
Bill Karwin 17.11.2008, 18:35
quelle
5

Sie können status+0 verwenden, um den Index des ENUM beginnend mit 1 zurückzugeben.

Siehe Ссылка

    
felixlaumon 01.04.2011 10:29
quelle
3

ist gerade auf dasselbe Problem gestoßen. Wenn Sie ein enum-Feld sortieren wollen, müssen Sie es zuerst in einen String-Typ umwandeln (category ist mein enum-Feld im Beispiel):

%Vor%

eazy!

    
user188794 13.10.2009 02:05
quelle
2

Sie können FIELD(column, "string1", "string2", ...) verwenden, um Zeilen mit allen zu finden bestimmte Teilmenge der möglichen ENUM -Werte.

%Vor%

Wenn Sie die Bereichsversion verwenden möchten, können Sie FIND_IN_SET("needle", "hay,stack") , um den Index zurückzugeben, aber Sie müssen zuerst die ENUM-Liste aus der Tabellendefinition mit einer anderen Abfrage extrahieren.

    
Kendrick Erickson 17.11.2008 00:02
quelle
0

Erstellen Sie eine Funktion:

%Vor%

Dann verwenden Sie es in einer Abfrage wie folgt:

%Vor%

Die SELECT REPLACE(REPLACE(REPLACE(COLUMN_TYPE,''', ''',','),'enum(',''),')','') wird die COLUMN_TYPE wie ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' ) nehmen und sie in eine kommagetrennte Liste verwandeln: 'alpha, beta, gamma, delta, omega' . Dann erhält der FIND_IN_SET(_val, _lst) den Index.

Sie müssen nur darauf achten, wie Sie die ENUMs (mit oder ohne Leerzeichen zwischen den Elementen) und die innerste REPLACE (mit oder ohne Leerzeichen im from_string) definieren.

    
John Frickson 30.07.2014 15:27
quelle

Tags und Links