Để bảo toàn NULL, hãy sử dụng CROSS JOIN ... CASE:
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)
Thay vì:
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
Một trình soạn thảo văn bản với chế độ cột làm cho các truy vấn như vậy dễ viết hơn. UltraEdit có nó, Emacs cũng vậy. Trong Emacs, nó được gọi là chỉnh sửa hình chữ nhật.
Bạn có thể cần phải viết nó cho 100 cột.