Как удалить одинарные кавычки из имени столбца запроса sql в Java - PullRequest
1 голос
/ 21 июня 2020

Я получаю примерно такую ​​строку.

'ename' = 'ABC' AND 'esal' > '10000' OR 'dept' != 'HR'

Я хочу добавить это условие в запрос sql через Java, но перед этим мне нужно удалить одинарные кавычки из имен столбцов и это состояние должно выглядеть, как показано ниже.

ename = 'ABC' AND esal > '10000' OR dept != 'HR'

Как я могу сделать это в Java.

Я написал фрагмент кода ниже. пожалуйста, предложите, есть ли для этого лучшее решение.

char[] arr = str.toCharArray(); 
for(int i= 0; i< arr.length; i++) { 
   if(arr[i] == '=' || arr[i] == '>') { 
      int temp = i-1; 
      int count = 0; 
      while(count < 2) { 
        if(arr[temp] == '\'') { 
           arr[temp] = '\0'; 
           count++; 
        } 
        temp--; 
      } 
   } 
} 

1 Ответ

0 голосов
/ 21 июня 2020

Для простых 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...