Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Update语句之后获取WHERE子句_Java_Mysql - Fatal编程技术网

Java 在Update语句之后获取WHERE子句

Java 在Update语句之后获取WHERE子句,java,mysql,Java,Mysql,我需要在update语句之后获取where子句,例如 updateuser\u accounts SET bio='This is my bio',其中user\u id=1或name='Alex'; 目前,我可以使用以下代码获取where子句之后的所有内容: String query=“UPDATE user\u accounts SET bio='This is my bio',其中user\u id=1或name='Alex'; int index=query.toUpperCase()

我需要在update语句之后获取where子句,例如

updateuser\u accounts SET bio='This is my bio',其中user\u id=1或name='Alex';
目前,我可以使用以下代码获取where子句之后的所有内容:

String query=“UPDATE user\u accounts SET bio='This is my bio',其中user\u id=1或name='Alex';
int index=query.toUpperCase().indexOf(“WHERE”);
如果(索引!=-1){
System.out.println(query.substring(index));
}
但后来我发现这有很大的缺陷,因为这些示例查询将失败:

updateuser\u accounts SET bio='这是我的bio'where user\u id=1或name='Alex'所在的位置;
更新用户\u帐户集,其中列='',其中用户\u id=1或名称='Alex'
更新用户\u行踪集columnName='',其中用户\u id=1或name='Alex'
本质上,如果表名或集合下的任何列名或列值包含单词“where”(不区分大小写),则此操作将失败

我目前的想法是按照一个正则表达式的思路,该正则表达式执行以下操作:

  • 检查单词where是否介于“”或“”(例如bio=“This is where my bio is”)之间,并跳过它以移动到不在引号内的单词。这将有助于消除设置值中的where单词。当然,字符串周围的Java引号不适用,因为它们不是字符串本身的一部分
  • 检查单词where是否夹在空格之间(例如…,where…)。这将有助于消除在表名或列名中发现的where字(SQL语法本身不能允许表名或列名仅为保留字)
  • 最后,返回所需位置的索引,以获取子字符串(问题的目标)

  • 我不太熟悉正则表达式,因此需要帮助。请注意,实现该目标的任何其他方法也将受到高度赞赏。

    您需要某种SQL解析器,因为正则表达式在许多情况下都会失败(例如,如果where子句有一个子选择怎么办?)


    我从未尝试过它,但它似乎是一个很好的解决方案

    您需要某种SQL解析器,因为正则表达式在许多情况下都会失败(例如,如果where子句有一个子select怎么办?)


    我从未尝试过,但使用JSqlParser似乎是一个很好的解决方案这看起来像:

    List<String> sqls = Arrays.asList("UPDATE user_accounts SET bio='This is my bio' WHERE user_id = 1 OR name = 'Alex';",
        "UPDATE user_accounts SET whereColumn='' WHERE user_id = 1 OR name = 'Alex'",
        "UPDATE user_whereabouts SET columnName='' WHERE user_id = 1 OR name = 'Alex'");
    
    for (String sql : sqls) {
        Statement stmt = CCJSqlParserUtil.parse(sql);
        Update update = (Update)stmt;
    
        System.out.println("sql=" + stmt.toString());
        System.out.println("   where=" + update.getWhere());   
    }
    
    但你同样是对的,这个版本也有缺陷,例如,
    set col='testwhere test'


    正确的方法是通过解析器()解析整个sql。

    使用JSqlParser这看起来像:

    List<String> sqls = Arrays.asList("UPDATE user_accounts SET bio='This is my bio' WHERE user_id = 1 OR name = 'Alex';",
        "UPDATE user_accounts SET whereColumn='' WHERE user_id = 1 OR name = 'Alex'",
        "UPDATE user_whereabouts SET columnName='' WHERE user_id = 1 OR name = 'Alex'");
    
    for (String sql : sqls) {
        Statement stmt = CCJSqlParserUtil.parse(sql);
        Update update = (Update)stmt;
    
        System.out.println("sql=" + stmt.toString());
        System.out.println("   where=" + update.getWhere());   
    }
    
    但你同样是对的,这个版本也有缺陷,例如,
    set col='testwhere test'


    正确的方法是通过解析器()解析整个sql。

    您需要在标记中分解查询,其中字符串文本是单个标记。WHERE子句的
    WHERE
    将是一个标记,而字符串文本中的
    WHERE
    则不是(因为它是较大标记的一部分)。正则表达式“\s+WHERE\s+”确保“WHERE”是整个单词,但Mark的注释更合适。类似的事情需要标记化。您需要在标记中分解查询,其中字符串文本是单个标记。WHERE子句的
    WHERE
    将是一个标记,而字符串文本中的
    WHERE
    则不是(因为它是更大标记的一部分)。正则表达式“\s+WHERE\s+”确保“WHERE”是整个单词,但马克的注释更合适。类似的事情需要标记化。