2

我目前正在使用该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

4 回答 4

1

您所描述的是ENUM数据类型。将列创建为ENUM列表的一个,您可以避免所有字符串替换。这些值将以其整数格式存储,并且必须是可用选项之一,但将显示为它们的字符串等价物。

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

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

于 2013-01-11T18:51:25.910 回答
1

使用映射表会更容易。

替换值
---------------
值数
iOS 2
网页 1
安卓 3
视窗 4

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

于 2013-01-11T18:51:35.467 回答
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
于 2013-01-11T18:52:18.193 回答
0

Try this:

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
于 2013-01-11T18:53:46.013 回答