我可以比较MySQL枚举吗?

我可以比较MySQL枚举吗?,sql,mysql,enums,compare,Sql,Mysql,Enums,Compare,我有一个枚举:ENUM('alpha','beta','gamma','delta','omega') 如果我按此列对表进行排序,我将按照上面定义的正确顺序得到它们 但是,我找不到一种方法来选择其中的一个子集,例如delta之前的所有内容。使用其中status

我有一个枚举:
ENUM('alpha','beta','gamma','delta','omega')

如果我按此列对表进行排序,我将按照上面定义的正确顺序得到它们

但是,我找不到一种方法来选择其中的一个子集,例如delta之前的所有内容。使用
其中status<'delta'
仅返回alpha和beta,而不是gamma。看起来MySQL使用的是字符串比较,而不是枚举索引比较

我可以使用索引号,即状态<4,但这有点代码味道(幻数),如果我在枚举中插入新值,可能会中断。

您可以使用来查找包含任何特定的
枚举值子集的行

SELECT * FROM `table` WHERE FIELD(`enum_column`, "alpha", "delta", "et cetera");

如果要使用范围版本,可以使用返回索引,但必须先通过另一个查询从表定义中提取枚举列表。

您试图对元数据使用数据操作方法,这肯定会很尴尬


这是将
枚举
替换为查找表外键的一个很好的理由。然后你可以使用传统的数据处理技术。

刚刚遇到了同样的问题。如果要对枚举字段进行排序,必须首先将其转换为字符串类型(示例中的类别是我的枚举字段):


恶心

您可以使用
status+0
从1开始返回枚举的索引

请参阅创建函数:

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') ;
从MyTable中选择*,其中状态
选择REPLACE(REPLACE(REPLACE(REPLACE(COLUMN_TYPE),,,,,,,,,,,,,,,),
将使用
列_TYPE
例如
枚举('alpha','beta','gamma','delta','omega')
并将其转换为逗号分隔的列表:
alpha,beta,gamma,delta,omega'
。然后
FIND_IN_SET(_val,_lst)
获取索引


唯一需要注意的是如何定义枚举(项目之间有空格或没有空格)和最里面的
REPLACE
(from_字符串中有空格或没有空格)。

这听起来与我的问题相反。我希望排序是数字的,这很好。我的问题是WHERE条款。也许有一种方法可以将枚举字段转换为数值并使用它?现在对我来说真的不重要了,我差不多一年前问过这个问题,我甚至都不记得是为了什么。。。
SELECT * FROM MyTable WHERE Status < fEnumIndex('MyTable','Status','delta') ;