Для простых sql статусов, подобных вашему примеру, которые объединены только с and
и or
, вы можете попробовать что-то подобное, как показано ниже. Но это не будет работать со сложными состояниями, если у вас есть, например, вложенные предложения In
или subselects
.
String query ="'ename' = 'ABC' AND 'esal' > '10000' OR 'dept' != 'HR'";
String andOrRegex = "((?<=(AND|OR))|(?=(AND|OR)))";
String compOperRegex = "((?<=[=\\!<>]+)(?![=\\!<>])|(?<![=\\!<>])(?=[=\\!<>]+))";
String[] splited = query.split(andOrRegex);
String modified = Arrays.stream(splited)
.map(s -> s.split(compOperRegex))
.map(arr -> arr.length > 1 ? new String[]{arr[0].replace("'", ""),arr[1],arr[2]} : arr)
.flatMap(Arrays::stream)
.collect(Collectors.joining());
System.out.println(modified);
Что делает приведенный выше фрагмент:
Разделите строку на AND
и OR
, но сохраните разделители, чтобы получить что-то вроде этого
['ename' = 'ABC' , AND, 'esal' > '10000' , OR, 'dept' != 'HR']
поток по массиву и разделение на один или несколько операторов сравнения [=\\!<>]+
для получения
[['ename' , =, 'ABC' ], [AND], [ 'esal' , >, '10000' ], [OR], [ 'dept' , !=, 'HR']]
Заменить одинарные кавычки в первом элементе массива
Сопоставьте одиночные массивы и объедините их снова в строку, чтобы получить желаемый результат
ename = 'ABC' AND esal > '10000' OR dept != 'HR'