在SQL /映射状态代码中转换枚举数据

时间:2011-12-28 13:34:27

标签: mysql sql

我不完全确定如何标题这个问题,很难描述我在标题中的含义。基本上我所拥有的是枚举状态代码,我正在寻找一种简单的方法将这些代码映射到查询中的数据。

例如,假设我在某处定义了以下内容。它们不受我的控制,不在数据库中:

CODE     STATUS
----------------
1      = ACTIVE
2      = SUSPENDED
3      = CLOSED
4      = CANCELED
5      = ETC...

SELECT item_title, status_code FROM mytable WHERE foo='bar';

整数代码存储在数据库中,但是通常情况下,如果我能让mysql知道它们翻译的内容会有所帮助,特别是对于排序,但是有很多次它会有所帮助。我知道可以做这样的事情:

SELECT item_title,
    IF(status_code=1,'ACTIVE',
        IF(status_code=2,'SUSPENDED',
            IF(status_code=3,'CLOSED',
                IF(status_code=3,'CANCELED', ...)
            )
        )
    ) AS real_status
FROM mytable WHERE foo='bar';

但这很乏味,很丑陋且容易出错,在某些情况下我可能有50个或更多代码,所以这通常不是解决方案。理想情况下,我会在表中使用代码定义,因此我可以简单地加入它,但这不是一个选项。

我希望有一些我不知道的MySQL功能或技术可以解决这个问题。

编辑: 为了澄清,状态代码未在数据库中定义,它们在代码中定义。我可以在查询后翻译代码中的状态,但这并不理想。基本上,我在询问是否有办法在sql中执行此操作:

SELECT $statushash[tbl.status_code] AS real_status FROM mytable AS tbl...

1 个答案:

答案 0 :(得分:2)

假设您无法创建查找表,我可以想到两种可能性:

1.创建user-defined function。但是,在MySQL中创建UDF的restrictions非常严格。

2.创建一个模拟查找表的view - 如下所示:

CREATE VIEW v_enum_lookup AS
select 1 as status_code, 'ACTIVE' as status_description UNION ALL
select 2 as status_code, 'SUSPENDED' as status_description UNION ALL
...

(等)