Skip to content

Commit 8e8bb70

Browse files
AkkaXdXdLeiJun
andauthored
Add support for oracle UnPivot when use multi columns at once. (#1419)
Co-authored-by: LeiJun <[email protected]>
1 parent 1fe92bc commit 8e8bb70

File tree

5 files changed

+19
-8
lines changed

5 files changed

+19
-8
lines changed

src/main/java/net/sf/jsqlparser/statement/select/UnPivot.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class UnPivot {
1818

1919
private boolean includeNulls = false;
2020
private boolean includeNullsSpecified = false;
21-
private Column unpivotClause;
21+
private List<Column> unpivotClause;
2222
private List<Column> unpivotForClause;
2323
private List<SelectExpressionItem> unpivotInClause;
2424
private Alias alias;
@@ -40,11 +40,11 @@ public boolean getIncludeNullsSpecified() {
4040
return includeNullsSpecified;
4141
}
4242

43-
public Column getUnPivotClause() {
43+
public List<Column> getUnPivotClause() {
4444
return unpivotClause;
4545
}
4646

47-
public void setUnPivotClause(Column unpivotClause) {
47+
public void setUnPivotClause(List<Column> unpivotClause) {
4848
this.unpivotClause = unpivotClause;
4949
}
5050

@@ -69,7 +69,7 @@ public String toString() {
6969
return "UNPIVOT"
7070
+ (includeNullsSpecified && includeNulls ? " INCLUDE NULLS" : "")
7171
+ (includeNullsSpecified && !includeNulls ? " EXCLUDE NULLS" : "")
72-
+ " (" + unpivotClause
72+
+ " (" + PlainSelect.getStringList(unpivotClause, true, unpivotClause != null && unpivotClause.size() > 1)
7373
+ " FOR " + PlainSelect.getStringList(unpivotForClause, true, unpivotForClause != null && unpivotForClause.size() > 1)
7474
+ " IN " + PlainSelect.getStringList(unpivotInClause, true, true) + ")"
7575
+ (alias!=null ? alias.toString() : "");

src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,12 +306,14 @@ public void visit(Pivot pivot) {
306306
public void visit(UnPivot unpivot) {
307307
boolean showOptions = unpivot.getIncludeNullsSpecified();
308308
boolean includeNulls = unpivot.getIncludeNulls();
309+
List<Column> unPivotClause = unpivot.getUnPivotClause();
309310
List<Column> unpivotForClause = unpivot.getUnPivotForClause();
310311
buffer
311312
.append(" UNPIVOT")
312313
.append(showOptions && includeNulls ? " INCLUDE NULLS" : "")
313314
.append(showOptions && !includeNulls ? " EXCLUDE NULLS" : "")
314-
.append(" (").append(unpivot.getUnPivotClause())
315+
.append(" (").append(PlainSelect.getStringList(unPivotClause, true,
316+
unPivotClause != null && unPivotClause.size() > 1))
315317
.append(" FOR ").append(PlainSelect.getStringList(unpivotForClause, true,
316318
unpivotForClause != null && unpivotForClause.size() > 1))
317319
.append(" IN ").append(PlainSelect.getStringList(unpivot.getUnPivotInClause(), true, true)).append(")");

src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ public void visit(UnPivot unpivot) {
175175
validateFeature(Feature.unpivot);
176176

177177
validateOptionalExpressions(unpivot.getUnPivotForClause());
178-
validateOptionalExpression(unpivot.getUnPivotClause());
178+
validateOptionalExpressions(unpivot.getUnPivotClause());
179179
}
180180

181181
@Override

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2294,7 +2294,7 @@ PivotXml PivotXml():
22942294
UnPivot UnPivot():
22952295
{
22962296
UnPivot retval = new UnPivot();
2297-
Column unpivotClause;
2297+
List<Column> unpivotClause;
22982298
List<Column> unpivotForClause;
22992299
List<SelectExpressionItem> unpivotInClause;
23002300
Alias alias = null;
@@ -2303,7 +2303,7 @@ UnPivot UnPivot():
23032303
<K_UNPIVOT>
23042304
[ ( <K_INCLUDE> <K_NULLS> { retval.setIncludeNulls(true); }
23052305
| <K_EXCLUDE> <K_NULLS> { retval.setIncludeNulls(false); } ) ]
2306-
"(" unpivotClause = Column() <K_FOR>
2306+
"(" unpivotClause = PivotForColumns() <K_FOR>
23072307
unpivotForClause = PivotForColumns()
23082308
<K_IN> "("
23092309
unpivotInClause = PivotSingleInItems()

src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2568,6 +2568,15 @@ public void testUnPivot() throws JSQLParserException {
25682568
assertSqlCanBeParsedAndDeparsed(stmt);
25692569
}
25702570

2571+
@Test
2572+
public void testUnPivotWithMultiColumn() throws JSQLParserException {
2573+
String stmt = "SELECT * FROM sale_stats" +
2574+
" UNPIVOT (" +
2575+
"(quantity, rank)" +
2576+
" FOR product_code IN ((product_a, product_1) AS 'A', (product_b, product_2) AS 'B', (product_c, product_3) AS 'C'))";
2577+
assertSqlCanBeParsedAndDeparsed(stmt);
2578+
}
2579+
25712580
@Test
25722581
public void testPivotWithAlias() throws JSQLParserException {
25732582
assertSqlCanBeParsedAndDeparsed("SELECT * FROM (SELECT * FROM mytable LEFT JOIN mytable2 ON Factor_ID = Id) f PIVOT (max(f.value) FOR f.factoryCode IN (ZD, COD, SW, PH))");

0 commit comments

Comments
 (0)