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

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 语句

以上是关于为列映射记录名称的更简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

检索 Azure VM 的公共 IP 地址的更简单方法

如何将mysql行转换为列的简单方法

动态获取当前方法名称的更短方法[重复]

使用 Maybe 遍历嵌套记录的更短方法

建议将行转换为列的方法

有没有一种简单的方法可以将 CSV 文件中记录的行号映射到 POCO?