我有一個包含許多列的源表A.我想要將源錶轉換爲目標表。我想要有一個與源表A相同列的映射表,以及構成翻譯的行。如何編寫使用通配符映射進行轉換的SQL查詢
下面是表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) – Hogan
最好是,它既可以在SQL服務器上運行,也可以在Oracle上運行,如果你的想法只適用於其中的一種,SQL服務器是首選的 – codermanden
我並不關注你認爲你看到的問題:「問題是,isnull(..,..)將匹配所有內容。」如果'm.col1'爲空,則'isnull(m.col1,t.col1)'(或'coalesce(m.col1,t.col1)')將返回't.col1',否則返回'm.col1'。這怎麼會導致不同的行爲,而不是將null當作通配符來做呢? –