【问题标题】:Can I compare MySQL enums?我可以比较 MySQL 枚举吗?
【发布时间】:2010-09-22 14:44:14
【问题描述】:

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

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

但是,我找不到选择其中一部分的方法,例如三角洲之前的一切。使用WHERE status < 'delta' 只会返回 alpha 和 beta,而不是 gamma。似乎 MySQL 使用的是字符串比较,而不是枚举索引比较。

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

【问题讨论】:

    标签: sql mysql enums compare


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        轻松!

        【讨论】:

        • 这听起来与我的问题相反。我希望排序是数字的,这很好。我的问题是 WHERE 子句。虽然也许有一种方法可以将 ENUM 字段转换为数值并使用它?现在对我来说真的不重要,我差不多一年前问过这个,我什至不记得它是为了什么......
        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          创建一个函数:

          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_TYPEENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' ) 并将其转换为逗号分隔的列表:'alpha, beta, gamma, delta, omega'。然后FIND_IN_SET(_val, _lst) 获取索引。

          您唯一需要注意的是如何定义 ENUM(项目之间有或没有空格)和最里面的 REPLACE(在 from_string 中有或没有空格)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-06
            • 1970-01-01
            • 1970-01-01
            • 2012-05-04
            • 1970-01-01
            • 2023-03-09
            • 2023-03-17
            • 1970-01-01
            相关资源
            最近更新 更多