2012-06-25 65 views
0

我想獲取Java中數據庫查詢主要where子句的索引嗎? 我該如何處理這與正則表達式?獲取查詢的主要位置

例如,在此查詢我想獲得第二where子句:

select u.id, (select x.id from XEntity where x.id = 200) 
    from UserEntity u 
    **where** u.id in (select g.id from AnotherEntity g where g.id = 100) 

我覺得主要哪裏是其中「(」字和「)」字符數是後相等。 但我不知道如何才能得到這與正則表達式。

與問候

+0

你爲什麼要這樣做? – Tomalak

+3

使用正則表達式識別WORDS而不是STRUCTURES:http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html –

回答

0

Toote和David Brabant說的絕對正確。解析SQL,特別是使用正則表達式的複雜SQL是一個非常困難的問題。

在解析Java中的SQL(這似乎是你的問題的主旨)方面,有一個非常好的(如果明顯未被維護的)庫called JSQLParser。這個庫的更新版本可以在Github上找到here(免責聲明:我做了一個非常小的貢獻)。主頁面顯示了一個設計用於消耗AST here輸出的訪問者的例子。

ANTLR available in it's grammar list也有一個語法。或者,如果您感覺冒險,H2數據庫支持相當廣泛的SQL,包括一些專有功能,例如MySQL。您可以修改它的Parser以生成適當的結構來提取您需要的信息。

0

正則表達式是不承認的SQL查詢可以是這樣複雜的結構非常好。主要是因爲SQL不是上下文無關的,這正是您遇到的問題:WHERE可能出現在很多地方,您希望特別取決於查詢的整體結構。

你需要的是一個合適的解析器。 only JavaScript SQL parser I could find不是太完整,但您始終可以通過確保它適合您的需求來幫助開發它。