如何拆分多行INSERT INTO sql语句?

时间:2018-03-09 12:36:48

标签: java sql regex

我想匿名化以.sql文件形式提供的数据库中的值。为此,我们用Java和foreach行解析文件,我们确定它是否插入。在这种情况下,我们想要替换随机字符串的每个值之一。让我们说“测试1'对于' a38Xw',' Test2'对于' e89cz'和'测试3'对于' 389xb'在以下示例中:

INSERT INTO `user` VALUES (1,NULL,NULL,NULL,NULL,NULL,NULL,'Test1',NULL,'\0'),
                          (7,NULL,NULL,NULL,NULL,NULL,NULL,'Test2',NULL,'abc'),
                          (8,NULL,NULL,NULL,NULL,NULL,NULL,'Test3',NULL,'abc');

插入到同一行中有很多值时出现问题。我们需要拆分每个寄存器的行。我们认为以正则表达式做这件事可能是一个好主意,但我们无法接受任何有效的工作,因为我们刚刚进入这个世界。

这是一种有效的方法吗?我们如何确定我们以正确的方式分割线?这个正则表达式的外观如何?

1 个答案:

答案 0 :(得分:1)

我会为这种工作学习专用的SQL解析库。正则表达式是一个有用的工具,但不足以捕获编程语言的所有细节。您可能设法构建一个可以在95%的时间内工作的正则表达式,但迟早它会在一些意想不到但完全合法的SQL语法上中断。

您可能想尝试JSqlParser。我花了10分钟浏览他们的回购来设置这个例子:

// testString is your example statement
Insert stmt = (Insert) CCJSqlParserUtil.parse(testString);
stmt.accept(new StatementVisitorAdapter() {
    @Override
    public void visit(Insert insert) {
        ItemsList list = insert.getItemsList();
        list.accept(new ItemsListVisitorAdapter() {
            @Override
            public void visit(ExpressionList expressionList) {
                Expression expression = expressionList.getExpressions().get(9);
                if (expression instanceof StringValue) {
                    StringValue val = (StringValue) expression;
                    expressionList.getExpressions().set(9, 
                        new StringValue(val.getValue().toUpperCase()));
                }
            }
        });
    }
});
System.out.println(stmt.toString());

使用给定的输出:

INSERT INTO `user` VALUES (1, NULL, NULL, NULL, NULL, NULL, NULL, 'Test1', NULL, '\0'), 
  (7, NULL, NULL, NULL, NULL, NULL, NULL, 'Test2', NULL, 'ABC'), 
  (8, NULL, NULL, NULL, NULL, NULL, NULL, 'Test3', NULL, 'ABC')

这只是将最后一列的值转换为大写,但你会弄清楚其余的。