我可以比较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') ;