将Oracle SQL与ibatis结合使用,可以返回大量类似的计算数据

将Oracle SQL与ibatis结合使用,可以返回大量类似的计算数据,sql,oracle,ibatis,Sql,Oracle,Ibatis,我有一个查询,它返回一行和大量列。我的查询的顶部如下所示: sum(CASE WHEN status = 'hello' THEN begin ELSE 0 END) hello_begin, sum(CASE WHEN status = 'hello' THEN middle ELSE 0 END) hello_middle, sum(CASE WHEN status = 'hello' THEN end ELSE 0 END) hello_end, sum(CASE WHEN status

我有一个查询,它返回一行和大量列。我的查询的顶部如下所示:

sum(CASE WHEN status = 'hello' THEN begin ELSE 0 END) hello_begin,
sum(CASE WHEN status = 'hello' THEN middle ELSE 0 END) hello_middle,
sum(CASE WHEN status = 'hello' THEN end ELSE 0 END) hello_end,

sum(CASE WHEN status = 'smile' THEN begin ELSE 0 END) smile_begin,
sum(CASE WHEN status = 'smile' THEN middle ELSE 0 END) smile_middle,
sum(CASE WHEN status = 'smile' THEN end ELSE 0 END) smile_end,

...
。。。我有10种不同的状态,所以这是30列。我只会写30条语句。但是有没有一种聪明的方法来压缩它,这样我就不会犯一些愚蠢的复制粘贴错误呢


我在iBatis中这样做,并将其返回到一个映射对象,在那里我开始了一个非常繁琐且不可扩展的转换,例如映射的映射。理想的解决方案是不用在Java中也这样做。

您可以将动态SQL与sp_executesql一起使用,并传递状态参数,但我只需将“hello”块复制9次,然后使用replace 9次,将“hello”替换为“whatever”。这似乎是一种使用复制粘贴大量路径来解决问题的情况,当另一个解决方案可能更好时。如果您通过这个大查询提供您想要解决的问题,可能有人可以帮助您提供更优雅的解决方案。您使用的是什么版本的Oracle?如果您使用的是11.1或更高版本,看起来您正在做一个pivot,您可以使用
pivot
关键字,而不是自己做。@SamDeHaan我想我只是需要一些方法将这30位数据传递回调用它的对象。除了在每列结果中放置一段数据之外,还有其他方法吗?这是一个很小的区别,但是
sum(状态为'hello',然后开始,否则0结束)
可以缩短为
sum(状态为'hello',然后开始,结束)
或者只是
sum(解码(状态为'hello',开始))