NULLを保持するには、CROSS JOIN ...を使用します。ケース:
select a.ID, b.column_name
, column_value =
case b.column_name
when 'col1' then a.col1
when 'col2' then a.col2
when 'col3' then a.col3
when 'col4' then a.col4
end
from (
select ID, col1, col2, col3, col4
from table1
) a
cross join (
select 'col1' union all
select 'col2' union all
select 'col3' union all
select 'col4'
) b (column_name)
代わりに:
select ID, column_name, column_value
From (
select ID, col1, col2, col3, col4
from table1
) a
unpivot (
column_value FOR column_name IN (
col1, col2, col3, col4)
) b
列モードのテキストエディタを使用すると、このようなクエリを簡単に作成できます。 UltraEditにはそれがあり、Emacsにもあります。 Emacsではそれは長方形編集と呼ばれています。
100列のスクリプトを作成する必要があるかもしれません。