2015-09-16 19 views
0

我有一個大的SQL語句,添加了一個新的需求,目前已經讓我難堪。 基本上,如果某行的cellA值與cellB的值不同,那麼使用一些額外的文本輸出行兩次。 ColumnA和columnB包含項目的舊/新值。但現在,而不是顯示:Oracle SQL - 故意從一個源行輸出2行

ITEM OLD NEW 
------------------  
ITEM A 123 456 

它需要表明:

ITEM  VALUE 
------------------- 
ITEM A OLD 123  
ITEM A NEW 456 

「項目的新」只有固定的文本因此多數民衆贊成細,能夠產生和舊/新值出現 - 所以他們'可用。我目前正在嘗試使用UNION ALL來選擇兩次行,但是SQL很長,這隻會讓它翻倍,似乎必須有更好的方法。

回答

1

你可以做這樣的事情:

create table test (item varchar(10), old int, new int); 
insert into test values ('ITEM A', 123, 456); 
insert into test values ('ITEM B', 123, 123); 

select item || ' OLD' as item, old as value from test where old <> new 
union all 
select item || ' NEW' as item, new as value from test where old <> new 

Result: 
|  ITEM | VALUE | 
|------------|-------| 
| ITEM A OLD | 123 | 
| ITEM A NEW | 456 | 

例子:http://sqlfiddle.com/#!4/5225a/3

+0

謝謝!這是目前我正在使用的方法,它的工作原理 - 雖然現實中的選擇語句非常大,但我理想地找到了一種以「簡寫」方式有效執行此操作的方法,而不是將文本翻倍 - 以便於未來進行維護。 – devranred

1

我個人比較喜歡union all方法,但還有一個選項:unpivot。這裏有一個例子:

select item, value 
from 
( (
     select 
      item,new,old 
     from test where new<>old 
    ) 
    unpivot 
    (
     value 
     for value_type in 
      (new,old) 
    ) 
) 

sqlfiddle

這一切都取決於您的查詢。如果你認爲這更適合你here是一個有更多例子的文章。

+0

謝謝。這對了解情況很有用,但正如你所建議的那樣 - 工會似乎現在可以選擇。 – devranred