映射列的记录名称的方法更简单?

时间:2013-01-11 18:47:55

标签: mysql sql select case

我目前正在使用REPLACE函数更改几个记录名称(整数到相应的人类可读名称),如下所示:

SELECT SUM(COUNT) AS Actions, replace(replace(replace(replace(replace(replace(EVENT, 2, 'iOS'), 1, 'Web'), 3, 'Android'), 4, 'Windows'), 5, 'Mac'), 6, 'Unknown') AS Platform 
FROM `METRICS_WEEKLY` 
WHERE EVENT IN (1, 2, 3, 4 ,5 ,6) 
GROUP BY EVENT

我想构建一个在EVENT列中使用超过30个数字的查询,并将它们映射到更友好的名称。我无法更改当前表(我不是表模式的创建者)。是否有更简单的方法来映射更多的字段名称?

4 个答案:

答案 0 :(得分:1)

您所描述的是ENUM data type。将列创建为列表的ENUM,并避免所有字符串替换。这些值将以整数格式存储,必须是可用选项之一,但将显示为其等效字符串。

CREATE TABLE `METRICS_WEEKLY` (
  `COUNT` INT,
  `EVENT` ENUM (
    'Web',
    'iOs',
    'Android',
    'Windows'
    'Mac',
    'Unknown'
  )
);

或者,如果列表很短,请根据正确的规范化创建一个表来保存这些值。

答案 1 :(得分:1)

使用映射表会更容易。

ReplaceValue
---------------
value    number
iOS      2
Web      1
Android  3
Windows  4

然后JOIN上的value并使用number。您可能需要考虑创建一个关系,以便在更新要替换的值时,它们将级联到子表。

答案 2 :(得分:1)

你真的非常想要一个EventType参考表。与此同时,这样的事情:

select EventName, COUNT(*) as Actions
from Metrics_Weekly mw left outer join
     (select 'iOS' as EventName, 2 as EventId union all
      select 'Web', 1 union all
      select 'Android', 3 union all
      select 'Window', 4 union all
      select 'Mac', 5 union all
      select 'Unknown', 6
     ) eventType
     on mw.Event = evenType.eventId
group by eventName

答案 3 :(得分:0)

试试这个:

SELECT SUM(COUNT) AS Actions, 
        (CASE event 
            WHEN 1 THEN 'Web' 
            WHEN 2 THEN 'iOS' 
            WHEN 3 THEN 'Android'
            WHEN 4 THEN 'Windows' 
            WHEN 5 THEN 'Mac' 
        ELSE 'Unknown' END )  AS Platform
FROM METRICS_WEEKLY
WHERE EVENT IN (1, 2, 3, 4 ,5 ,6) 
GROUP BY EVENT