当前位置:首页 > 数据库 > Oracle

mysql 实现类似oracle函数bitand功能

oracle中位运算函数bitand中在mysql的实现是 &运算符,我司使用的JPA要在oracle和mysql中自由切换,所以使用统一的位运算操作方法

mysql实现bitand函数的功能,我们有两种解决方案:

1. 在mysql中,自定义函数bitand, 

            CREATE DEFINER=`root`@`%` FUNCTION `bitand`(num1 decimal(65,0),num2 decimal(65,0)) RETURNSdecimal(65,0)
BEGINDECLARE result decimal(65,0);
    select num1&num2 into result;
    RETURN result;
END

 

2.sql拦截,在StatementInspector中把生成sql中的bitand转换成&运算。

这个方法也有多种实现,比如用正则替换法,把bitand(4,2)>0 替换成4&2>0,也可以。

还有就是用使用jsqlparser库,对sql进行分析,这个bitand函数只用在where条件中,所以,就可以这样写:

            /**
            
     * mysql处理 把bitand函数 替换成&运算
     *
     * 
            @param
             sql
     * 
            @return
            */
            private
             String getMysqlSql(String sql) {
        
            try
             {
            Statement statement = CCJSqlParserUtil.parse(sql);
            if (statement instanceof Select) {
                SelectBody selectBody = ((Select) statement).getSelectBody();
                PlainSelect plainSelect = (PlainSelect) selectBody;
                FromItem fromItem = plainSelect.getFromItem();
                Expression where = plainSelect.getWhere();
                if (where != null) {
                    where.accept(new ExpressionDeXParser());
                }
             return statement.toString();
            }
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }

        return sql;
    }

 

类ExpressionDeXParser的代码如下:

            public
            class ExpressionDeXParser extends ExpressionDeParser {

    @Override
    publicvoid visit(GreaterThan greaterThan) {
        super.visit(greaterThan);
        Expression leftExpression = greaterThan.getLeftExpression();
        Function function = (Function) leftExpression;
        if ("BITAND".equals(function.getName().toUpperCase())) {
            ExpressionList parameters = function.getParameters();
            BitwiseAnd bitwiseAnd = new BitwiseAnd();
            bitwiseAnd.setLeftExpression(parameters.getExpressions().get(0));
            bitwiseAnd.setRightExpression(parameters.getExpressions().get(1));
            greaterThan.setLeftExpression(bitwiseAnd);
        }
    }
}

 

这注意第二种方法需求判断当前使用的数据库是否为mysql.要不然就出笑话了。

原文:https://www.cnblogs.com/hankuikui/p/12105677.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐