创建一个函数:
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中有或没有空格)。
这听起来像我的问题相反。我想要的订单是数字,它没有问题。我的问题是与WHERE子句。虽然也许有一种方法可以将ENUM字段转换为数值并使用它?现在对我来说无所谓,我在近一年前问过这个问题,我什至不记得它是什么... – DisgruntledGoat 2009-10-13 15:35:41