Oracle SQL-故意从一个源行输出2行
我有一个很大的SQL语句,需要添加一个新的需求,这到目前为止一直困扰着我。 基本上,如果一行的cellA值与cellB值不同,则使用一些额外的文本输出该行两次。ColumnA和columnB包含项目的旧/新值。但现在,我们没有表现出: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
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语句太大了,我一直在寻找一种理想的方法,用“速记”而不是将文本翻一番来有效地做到这一点——以便于今后的维护。谢谢。知道这一点很有用,但正如你所建议的那样——目前看来,工会确实是一个选择。