2013-01-11 74 views
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 

我想建立其在使用超過30個號碼查詢EVENT列並將它們映射到更友好的名稱。我無法改變當前表格(我不是表格模式的創建者)。是否有更簡單的方法來映射更大的字段名稱組?

+0

我只想說的是,使用replace'的'是相當聰明,在一定的方式,因爲該事件可能是以整數形式存儲。我永遠不會想到這樣做。 –

+0

你最好使用外鍵。可擴展和清晰。 – nkamm

回答

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 
+0

如果要添加或更改更多值,則不太可行。 – Kermit

+0

比你可以創建一個表中指定的所有事件。你可以很容易地加入這個表格,這樣做會很好 –

+0

@SaharshShah。 。 。使用'case'語句是一個非常合理的解決方案。但是,如果您將查詢格式化爲可讀性,則會更清楚。我仍然更喜歡我的解決方案(使用子查詢),因爲它很容易包含其他列,列可能證明對其他目的有用。 –

1

你所描述的是ENUM data type。創建該列作爲列表的ENUM,並避免所有字符串替換。這些值將以整數格式存儲,並且必須是是可用選項之一,但會顯示爲其字符串等效項。

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

或者,如果列表很短,則根據適當的規範化創建一個表來保存這些值。

+0

這是一個非常好的主意(我不知道ENUM類型)。但我現在不能改變表格或創建額外的表格。我更新了我的問題以反映這一點。 –

+0

@AndyShinn然後使用njk的表格關係。 (其實這就是我在這種情況下要做的而不是ENUM) –

1

使用映射表會更容易。

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

然後JOINvalue和使用number。您可能需要考慮創建關係,以便如果更新要替換的值,它們將級聯到子表。

+1

這個,而不是我的'ENUM',可能是這裏的_right_解決方案。 –

+0

這可能也是一個合理的解決方案。不幸的是,我現在無法添加或更新表格(我不得不使用當前應用程序給我的東西)。我很欣賞答案,並會考慮在有機會的情況下執行這樣的事情。 –

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 
+0

+1始終佩服您的及時解決方案。 – Kermit

+1

@njk。 。 。謝謝。打字是我在高中時最有價值的課程。 –

+0

到目前爲止,這看起來像是最好的解決方案,因爲我無法添加或更改表格。我正在測試這個。感謝這個精心製作的解決方案。我對SQL問題的快速反應感到驚訝。 –

相關問題