Создать функцию:
CREATE fEnumIndex(_table VARCHAR(50), _col VARCHAR(50), _val VARCHAR(50))
RETURNS INT DETERMINISTIC
BEGIN
DECLARE _lst VARCHAR(8192);
DECLARE _ndx INT;
SELECT REPLACE(REPLACE(REPLACE(COLUMN_TYPE,''', ''',','),'enum(',''),')','')
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND
TABLE_NAME=_table AND COLUMN_NAME=_col INTO _lst;
SET _ndx = FIND_IN_SET(_val, _lst);
RETURN _ndx;
END
Затем используйте его в запросе следующим образом:
SELECT * FROM MyTable WHERE Status < fEnumIndex('MyTable','Status','delta') ;
SELECT REPLACE(REPLACE(REPLACE(COLUMN_TYPE,''', ''',','),'enum(',''),')','')
возьмет COLUMN_TYPE
, например ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' )
, и превратит его в список через запятую: 'alpha, beta, gamma, delta, omega'
. Тогда FIND_IN_SET(_val, _lst)
получает индекс.
Единственное, с чем вам следует быть осторожным, это то, как вы определяете ENUM (с пробелами или без пробелов между элементами) и самый внутренний REPLACE
(с пробелом в строке from_string или без него).