我目前正在使用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个数字的查询,并将它们映射到更友好的名称。我无法更改当前表(我不是表模式的创建者)。是否有更简单的方法来映射更多的字段名称?
答案 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