11

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

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

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

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

4

5 回答 5

9

您可以使用status+0返回 ENUM 的索引,从 1 开始。

参考http://serghei.net/docs/database/mysql/doc/E/N/ENUM.html

于 2011-04-01T10:29:59.077 回答
7

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

ENUM这是用查找表的外键替换 的一个很好的理由。然后,您可以使用传统的数据处理技术。

于 2008-11-17T18:35:44.530 回答
3

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

SELECT
CONVERT(category USING utf8) as str_category 
FROM
example
GROUP BY
str_category
ORDER BY 
str_category

容易!

于 2009-10-13T02:05:49.923 回答
2

您可以使用它FIELD(column, "string1", "string2", ...)来查找具有任何特定可能ENUM值子集的行。

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

如果要使用范围版本,可以使用FIND_IN_SET("needle", "hay,stack")返回索引,但必须先使用另一个查询从表定义中提取 ENUM 列表。

于 2008-11-17T00:02:56.227 回答
0

创建一个函数:

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 中有或没有空格)。

于 2014-07-30T15:27:45.117 回答