使用案例加入映射

时间:2016-12-28 20:31:42

标签: mysql mapping left-join case

我想做一个简单的列映射,例如a =苹果,b =香蕉,c =黄瓜。

我可以

Select 
  consumer,
  case when letter = 'a' then 'apple'
  case when letter = 'b' then 'banana'
  case when letter = 'c' then 'cucumber' end as edible    
From letter_table

或者

Select
  consumer,
  mapping.edible
from letter_table left join mapping
  on letter_table.letter = mapping.letter

一种方法通常更可取吗?如果是这样的话?

我主要担心的是速度。使用大型映射,写出case语句会很麻烦,我通常会创建映射表并使用连接。对于小表,我通常会写出case语句。假设使用的列已编制索引,并且用户已读取写权限。

2 个答案:

答案 0 :(得分:1)

除非你有一个经证实的性能问题,否则我总是选择第二个选项,因为它允许你添加新的映射,它提供了一个权威的参考点,而不是依赖于每个查询来使它正确。我实际上会更进一步,删除多余的字母,而不是指向映射表的外键。

另一个值得考虑的选择是使用ENUM数据类型来存储完整值而不需要额外的磁盘空间。一个缺点是添加新类型需要ALTER TABLE,这对于大型表来说可能很昂贵。

答案 1 :(得分:0)

前一种方法将映射硬编码到您的代码中;而后一种方法允许地图随着时间的推移而不必触摸代码。

在我们的环境中,我们使用两种方法 - 我们使用前一种方法进行静态映射,如果映射可能随时间发生变化,则使用后者。