Нужна помощь с разбором SQL в Java - PullRequest
2 голосов
/ 06 февраля 2010

У меня есть код ниже, который разделяет SQL-оператор и дает его индексы для столбцов.

String sql = "INSERT INTO Table1(SSN, EMPID) VALUES (?,?)";

    public static List<Object[]> indices(String stmt) {
        List<Object[]> list = new ArrayList<Object[]>();
        String variables[] = null;
        try {
            variables = stmt.substring(stmt.indexOf('(')+1, 
                stmt.indexOf(')', stmt.indexOf('(')+1)).split("\\,");
        } catch (Exception e) {}

        for (int i=0; i < variables.length; ++i ) {
            Object [] str =  new Object [2] ;
            str[0] = variables[i].trim() ;
            str[1] = ((Integer)(i+1)) ;
            list.add(str) ;
        }
        return list;
    }


Result - 

list[0] >>

array[0] = SSN
array[1] = 1

list [1] >>
array[0] = EMPID
array[1] = 2

Может ли кто-нибудь указать мне соответствующее регулярное выражение, чтобы вместо этого разделить следующий sql -

sql = "if not exists (select * from Table1 where SSN = ? and EMPID =?)  
      INSERT INTO Table1(SSN, EMPID) VALUES (?,?)"

Я полагаю, что результат будет что-то вроде -

list[0] >>
array[0] = SSN
array[1] = 1

list [1] >>
array[0] = EMPID
array[1] = 2

list[2] >>
array[0] = SSN
array[1] = 1

list [3] >>
array[0] = EMPID
array[1] = 2

Спасибо

Ответы [ 3 ]

4 голосов
/ 06 февраля 2010

Попытка синтаксического анализа нетривиальных языков, таких как SQL, с использованием регулярных выражений или других низкоуровневых операций с цепочками строк - это BAD IDEA. В итоге вы получите нечитаемый код и хрупкий «парсер», который ломается, когда предоставляется ввод, который недопустим или действителен, но отличается.

Вам нужно либо реализовать правильный синтаксический анализатор SQL (или использовать существующий), либо изменить свой код так, чтобы вы не анализировали SQL, а собирали его из чего-то другого.

У меня есть приложение в зависимости от фреймворка, и я не хочу вводить новые библиотеки!

Это плохая причина для неправильного анализа. Что плохого в том, что вы не используете другую библиотеку ???

1 голос
/ 06 февраля 2010

Как насчет этого в качестве альтернативы: Zql, анализатор SQL . Может значительно облегчить доступ к «элементам» любого оператора SQL.

EDIT

Самый простой подход для второго SQL:

просто выполните sql.split("INSERT INTO") и примените существующий код ко второй записи массива (должно быть " Table1(SSN, EMPID) VALUES (?,?)"). Насколько я понимаю ваш код, он должен дать правильный результат.

Да, я пропустил вашу мысль. Используйте парсер.

0 голосов
/ 20 июня 2014

Парсер ZQL отлично.

Может анализировать почти все запросы , кроме CREATE

Особенности:

  • list colums,
  • list tables,
  • FOR clause,
  • WHERE clause
  • и т.д.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...