[alibaba/druid]使用SQLUtils.parseStatements解析postgresql 的查询语句出错

2025-11-05 997 views
3
   @Test
    public void parseTest() {
        String sql = "select * from orders \n" +
            "where address not like all (array['%北京%','%杭州%','%成都%'])";
//        String sql = "select * from orders where address=? ";
        List<SQLStatement> sqlList = SQLUtils.parseStatements(sql, DbType.of("postgresql"));
        SQLStatement stmt = sqlList.get(0);
        SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
        selectStmt.addWhere(new SQLBinaryOpExpr(new SQLIntegerExpr(1), SQLBinaryOperator.Equality, new SQLIntegerExpr(2)));
        System.out.println(stmt.toString());
    }

执行以上测试方法报错:com.alibaba.druid.sql.parser.ParserException: syntax error, expect ), actual ARRAY pos 55, line 2, column 30, token ARRAY

at com.alibaba.druid.sql.parser.SQLExprParser.accept(SQLExprParser.java:4626)

postgresql建表语句如下:

create table orders
(
    id serial not null
        constraint orders_pkey
            primary key,
    user_id integer not null,
    total numeric(10,2) not null,
    status smallint not null,
    createtime timestamp not null,
    address varchar(100),
    receiver varchar(50),
    mobile varchar(20)
);

INSERT INTO orders (user_id, total, status, createtime, address, receiver, mobile) VALUES
(1, 199.5, 1, '2023-02-15 15:32:08', '北京市海淀区XX街道XX号', '张三', '13900000000'),
(2, 249.8, 0, '2023-02-14 09:12:45', '上海市静安区XX路XX号', '李四', '13800000001'),
(3, 599.8, 1, '2023-02-16 12:18:25', '深圳市南山区XX大道XX号', '王五', '13700000002'); 
INSERT INTO orders (user_id, total, status, createtime, address, receiver, mobile) VALUES
(4, 299.9, 1, '2023-02-17 10:15:20', '武汉市武昌区XX路XX号', '赵六', '13600000003'),
(5, 399.8, 0, '2023-02-18 09:20:35', '杭州市西湖区XX街XX号', '孙七', '13500000004'),
(6, 799.5, 1, '2023-02-19 12:45:12', '成都市锦江区XX街XX号', '周八', '13400000005'),
(7, 549.2, 0, '2023-02-20 08:32:10', '南京市建邺区XX路XX号', '吴九', '13300000006'),
(8, 299.2, 1, '2023-02-21 11:08:45', '厦门市思明区XX街XX巷XX号', '郑十', '13200000007'),
(9, 199.8, 0, '2023-02-22 14:28:13', '福州市鼓楼区XX路XX号', '刘十一', '13100000008'),
(10, 449.5, 1, '2023-02-23 09:45:20', '广州市天河区XX街XX号', '陈十二', '13900000009'),
(11, 599.2, 0, '2023-02-24 12:32:08', '苏州市姑苏区XX路XX弄XX号', '张十三', '13800000010'),
(12, 699.8, 1, '2023-02-25 08:10:15', '大连市沙河口区XX街XX号', '王十四', '13700000011'),
(13, 399.5, 0, '2023-02-26 15:45:35', '青岛市市南区XX路XX号', '李十五', '13600000012');

datagrid中执行:select * from orders where address not like all (array['%北京%','%杭州%','%成都%']);结果如下:

回答

5

durid版本是1.2.19

6

解析不支持这个语法。

3

请问后续支持计划吗?这种where 条件中包含函数的还是挺常见的。

解析不支持这个语法。

请问后续支持计划吗?这种where 条件中包含函数的还是挺常见的。

0

暂无计划。