Вы можете сделать это с помощью этого подхода, где вы заменяете каждые ?
на (.*)
в своем запросе, а затем создаете шаблон на его основе. Затем примените другую пару строк с действительными значениями, а затем распечатайте значения во всех группах, которые будут динамически созданы в соответствии с ?
, присутствующим в строке запроса.
Вот код Java, делающий то же самое.
// This map stores your paired queries where key stores the placeholder query and value stores the query having actual parameters.
Map<String, String> pairMap = new HashMap<>();
pairMap.put("SELECT * FROM my_table t WHERE (t.attr1 = ? AND t.attr2 = ?) OR t.attr3= ?", "SELECT * FROM my_table t WHERE (t.attr1 = 3 AND t.attr2 = 'str') OR t.attr3= 4");
pairMap.put("UPDATE my_table SET attr2 = ? WHERE attr5 = ?", "UPDATE my_table SET attr2 = 'Is it true?' WHERE attr5 = 'What is it?'");
pairMap.forEach((k,v) -> {
System.out.println("For query: "+k);
k = k.replaceAll("([*+^$()\\[\\]{}])", "\\\\$1"); // this escapes all the characters that have special meaning in regex so they get treated as literal characters
k = k.replaceAll("\\?", "(.*)");
Pattern p = Pattern.compile(k);
Matcher m = p.matcher(v);
if (m.matches()) {
for (int i=0;i<m.groupCount();i++) {
System.out.println(m.group(i+1));
}
} else {
System.out.println("Didn't match");
}
System.out.println();
});
Какие отпечатки,
For query: SELECT * FROM my_table t WHERE (t.attr1 = ? AND t.attr2 = ?) OR t.attr3= ?
3
'str'
4
For query: UPDATE my_table SET attr2 = ? WHERE attr5 = ?
'Is it true?'
'What is it?'
Как вы можете видеть код, он работает для любых переменных значений заполнителей ?
в строке запроса и печатает все значения, присутствующие в парном запросе, который имеет действительные значения.