У меня есть куча операторов SQL, которые изначально были написаны для поддержки Oracle и используют множество специфических синтаксисов Oracle. Большую часть этого было довольно легко решить с помощью простого поиска и замены в стиле регулярных выражений или с помощью функций JDBC. Этот случай, однако, доставляет мне немного больше хлопот.
Есть несколько случаев, когда конкатенация используется для значений, и я пытаюсь заменить col1 || col2 || col3 должен быть заменен синтаксисом стиля CONCAT (col1, col2, col3) в случае, если ядро базы данных не является Oracle.
Я знаю, что было бы идеально использовать какой-либо ORM, но это не практично в этом случае по разным причинам.
У меня есть настройка тестового приложения для тестирования некоторых случаев, с которыми я, скорее всего, соприкоснусь, но у меня возникают проблемы с выяснением, как заставить его заменить весь экземпляр, а также с переменным числом совпадений после | |. Решение, как у меня сейчас, соответствует только последнему появлению столбца | Может быть, это невозможно, но я хотел бы попытаться исчерпать этот путь решения.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex {
public static void main(String args[]){
String sSource = "SELECT col1, col2||word||default_col||another field1, col3 || ' quote test ' || default_1 field2 FROM table order by 1";
try{
String pattern ="((\\b\\[a-zA-Z0-9_]+|'.*')\\s*(\\|\\|)\\s*(\\w+))";
Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE|Pattern.MULTILINE|Pattern.DOTALL);
Matcher m = p.matcher(sSource);
while(m.find()){
sSource = m.replaceAll("CONCAT($2 , $4)");
System.out.println("found match");
}
System.out.println(sSource);
} catch( Exception e) {
System.out.println("Bad things:" + e.getMessage());
}
}
}