【发布时间】:2015-05-12 19:13:44
【问题描述】:
我有一个包含许多列的源表 A。我想将源表转换为目标表。我想要一个映射表,其列与源表 A 相同,并且包含构成翻译的行。
这里是A表的一个例子:
COL1 COL2 COL3
aktie ja 2
aktie nej 3
obli ja 2
这是映射表
COL1 COL2 COL3 TRANSFORM
aktie ja NULL 3
aktie NULL NULL 4
现在,我们的想法是将源表与映射连接起来,并返回转换后的值。 NULL 的使用应用作通配符。所以我想要的结果应该是表 A 中的第一行将匹配映射表中的第一行并返回值 3
对于第二行 - 这是我的挑战 - 我希望它与映射表中的第二行匹配,因为它与已经具有值的行不匹配(这将导致转换后的值 3)并且作为第二个映射行在第二列中为 NULL,应将其视为通配符(尽管也要考虑映射表中的其他行)。
我的第一次尝试是这样的
select A.*, m.res
from tab1 A
inner join mapping m on t.col1 = isnull(m.col1, t.col1)
and t.col2 = isnull(m.col2, t.col2)
and ...
但问题是 isnull(..,..) 将匹配所有内容,并且不仅返回匹配项,但列出的可能值除外,这些值会导致不同的转换。
我正在寻找一种通用解决方案,它适用于具有任意数量列的任何表格,而不仅仅是这里提到的这个特定表格布局。
我一直在思考这个问题,但似乎无法真正想出解决方案,所以请帮忙:)
【问题讨论】:
-
您使用的是哪个平台?在我看来,最好是 SQL Server、Oracle 或 DB2(不适用于 mysql)
-
最好,它应该同时在 SQL server 或 Oracle 上工作,如果你的想法只在其中一个上工作,SQL Server 是首选
-
我没有按照您认为您的想法看到的问题:“问题是 isnull(..,..) 将匹配所有内容 [...]。”如果
m.col1为空,isnull(m.col1, t.col1)(或coalesce(m.col1, t.col1))将返回t.col1,否则返回m.col1。这与将 null 视为通配符会产生什么不同的行为? -
这个想法是应该将其视为通配符,但如果没有其他匹配项,则仅应将其视为通配符。在示例中,如果源表具有 col1 = aktie 并且 col2 是任何东西 BUT "ja" ,我只想让转换返回 4 。在一般情况下,它应该是映射表 col2 中的其他值以外的任何值。我希望我现在解释得更好?