我想做一个简单的列映射,例如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语句。假设使用的列已编制索引,并且用户已读取写权限。
答案 0 :(得分:1)
除非你有一个经证实的性能问题,否则我总是选择第二个选项,因为它允许你添加新的映射,它提供了一个权威的参考点,而不是依赖于每个查询来使它正确。我实际上会更进一步,删除多余的字母,而不是指向映射表的外键。
另一个值得考虑的选择是使用ENUM
数据类型来存储完整值而不需要额外的磁盘空间。一个缺点是添加新类型需要ALTER TABLE
,这对于大型表来说可能很昂贵。
答案 1 :(得分:0)
前一种方法将映射硬编码到您的代码中;而后一种方法允许地图随着时间的推移而不必触摸代码。
在我们的环境中,我们使用两种方法 - 我们使用前一种方法进行静态映射,如果映射可能随时间发生变化,则使用后者。