为列映射记录名称的更简单方法?
Posted
技术标签:
【中文标题】为列映射记录名称的更简单方法?【英文标题】:Easier way to map record names for a column? 【发布时间】:2012-12-26 10:07:04 【问题描述】:我目前正在使用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 个数字并将它们映射到更友好的名称。我无法更改当前表(我不是表架构的创建者)。有没有更简单的方法来映射更大的字段名称组?
【问题讨论】:
我只想说replace
的使用非常聪明,以某种方式,因为事件可能存储为整数。我从来没有想过这样做。
你最好使用外键。可扩展且清晰。
【参考方案1】:
您所描述的是ENUM
data type。将列创建为列表的ENUM
,这样就可以避免所有字符串替换。这些值将以其整数格式存储,并且必须是可用选项之一,但将显示为它们的等效字符串。
CREATE TABLE `METRICS_WEEKLY` (
`COUNT` INT,
`EVENT` ENUM (
'Web',
'iOs',
'Android',
'Windows'
'Mac',
'Unknown'
)
);
或者,如果列表很短,则根据适当的规范化创建一个表来保存这些值。
【讨论】:
这是一个非常好的主意(我不知道 ENUM 类型)。但我目前无法更改表或创建其他表。我更新了我的问题以反映这一点。 @AndyShinn 然后使用 njk 的表关系。 (实际上这就是我在这种情况下会做的,而不是 ENUM)【参考方案2】:使用映射表会更容易。
替换值 --------------- 值数 iOS 2 网页 1 安卓 3 视窗 4
然后在value
上使用JOIN
并使用number
。您可能需要考虑创建关系,以便在更新要替换的值时,它们将级联到子表。
【讨论】:
这可能是这里的正确解决方案,而不是我的ENUM
。
这可能也是一个不错的解决方案。不幸的是,我目前无法添加或更新表(我必须使用当前应用程序提供的内容)。不过,我很欣赏这个答案,如果有机会,我会考虑实施这样的事情。【参考方案3】:
你真的,真的,真的想要一个 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
【讨论】:
@njk 。 . .谢谢你。打字是我在高中时最有价值的课程。 到目前为止,这看起来是最好的解决方案,因为我无法添加或更改表。我正在测试这个。感谢这个精心设计的解决方案。我对 SQL 问题的快速响应感到惊讶。【参考方案4】:试试这个:
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
【讨论】:
如果要添加或更改更多值,则不太可行。 您可以创建一个表来指定其中的所有事件。您可以轻松地加入该表,这样做会很好 @SaharshShah 。 . .使用case
语句是一个非常合理的解决方案。但是,如果您格式化查询以使其可读,那会更清楚。我仍然更喜欢我的解决方案(使用子查询),因为它很容易包含其他列,这些列可能证明对其他目的有用。
这是一个合理的解决方案,因为我无法创建或更改当前表。我会试试这个。通过一些格式和回车,我认为它会更具可读性。
@andyshinn 检查我更新的答案。我还添加了 end 关键字来结束 case 语句以上是关于为列映射记录名称的更简单方法?的主要内容,如果未能解决你的问题,请参考以下文章