Oracle SQL-故意从一个源行输出2行

Oracle SQL-故意从一个源行输出2行,sql,oracle,Sql,Oracle,我有一个很大的SQL语句,需要添加一个新的需求,这到目前为止一直困扰着我。 基本上,如果一行的cellA值与cellB值不同,则使用一些额外的文本输出该行两次。ColumnA和columnB包含项目的旧/新值。但现在,我们没有表现出: ITEM OLD NEW ------------------ ITEM A 123 456 它需要表明: ITEM VALUE ------------------- ITEM A OLD 123

我有一个很大的SQL语句,需要添加一个新的需求,这到目前为止一直困扰着我。 基本上,如果一行的cellA值与cellB值不同,则使用一些额外的文本输出该行两次。ColumnA和columnB包含项目的旧/新值。但现在,我们没有表现出:

ITEM    OLD   NEW 
------------------      
ITEM A  123   456 
它需要表明:

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

新项目A仅为固定文本,因此可以生成,并且存在旧/新值-因此它们可用。我目前正在尝试使用UNIONALL来选择两行,但是SQL非常长,这只会使它加倍,似乎有更好的方法

您可以这样做:

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 |
示例:

我个人更喜欢union-all方法,但还有一个选择:unpivot。以下是一个例子:

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

这完全取决于您的查询。如果您认为这更适合您,请参阅一篇包含更多示例的文章。

谢谢!这是我目前正在使用的方法,它很有效——尽管事实上select语句太大了,我一直在寻找一种理想的方法,用“速记”而不是将文本翻一番来有效地做到这一点——以便于今后的维护。谢谢。知道这一点很有用,但正如你所建议的那样——目前看来,工会确实是一个选择。