package jef.database.query.function; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import jef.database.jsqlparser.expression.CaseExpression; import jef.database.jsqlparser.expression.WhenClause; import jef.database.jsqlparser.expression.operators.relational.EqualsTo; import jef.database.jsqlparser.visitor.Expression; /** * 用 case expr1 * when expr2 then expr3 * when ... then. * else ... * end 来模拟oracle的decode函数 * @author jiyi * */ public class EmuDecodeWithDerbyCase extends BaseArgumentSqlFunction{ public String getName() { return "decode"; } public Expression renderExpression(List<Expression> arguments) { LinkedList<Expression> copy=new LinkedList<Expression>(arguments); CaseExpression result=new CaseExpression(); Expression switchExpr=copy.removeFirst(); List<WhenClause> whens=new ArrayList<WhenClause>(); while(copy.size()>1){ WhenClause when=new WhenClause(); when.setWhenExpression(new EqualsTo(switchExpr,copy.removeFirst())); when.setThenExpression(copy.removeFirst()); whens.add(when); } result.setWhenClauses(whens); if(!copy.isEmpty()){ result.setElseExpression(copy.removeFirst()); } return result; } }