Я пытаюсь написать простой синтаксический анализатор SQL, чтобы разбить оператор SQL на его основные части. Однако у меня проблема с вложенными запросами. Пример лучше всего иллюстрирует:
sql = "select * from Customers where id in (select customer_id from Orders where 1=1)"
Set re = New RegExp
re.IgnoreCase = True
re.Pattern = "^(.*)\swhere\s(.*)$"
re.Global = True
Set matches = re.Execute( sql )
If matches.count > 0 Then
Set submatches = matches(0).Submatches
where_part = Trim(submatches(1))
everything_else = Trim(submatches(0))
End If
Response.Write where_part & "<br>"
Response.Write everything_else & "<br>"
Здесь я хочу, чтобы where_part содержал «id in (выберите customer_id из заказов, где 1 = 1)», а everything_else содержал «select * from Customers». То есть я хочу, чтобы он был как можно более жадным для второго (. *) И бескорыстным для первого. Или, другими словами, я хочу, чтобы все-остальные не содержали ни где.
Тем не менее, я получаю everything_else = "select * from Customers" с идентификатором (выберите customer_id из Orders "и where_part =" 1 = 1) "
Как я могу исправить это, не прибегая к беспорядочному разбору строк без регулярных выражений?