2011-01-17 3 views
2

먼저 정규 표현식을 실험하지는 않는다고 고백합니다. 나는 그것을 사용하는 방법을 압니다. 그러나 내가 그것을 만들고 싶을 때, 그것은 다른 것입니다 ... 나는 문서화 할 것입니다.SQL을 추출 할 정규 표현식 where

SQL 쿼리에서 WHERE 절을 추출하려고합니다.

SELECT * FROM myTbl WHERE columnA = 'B' AND columnB = 'C' ORDER BY columnX GROUP BY columnZ LIMIT 5 

TO : 내 목표는 다음과 같이 조건을 추가 할 수있을 것입니다 내가 어떤 표현을 시도하지만 난 무효로 해요

SELECT * FROM myTbl WHERE columnC = 'D' AND (columnA = 'B' AND columnB = 'C') ORDER BY columnX GROUP BY columnZ LIMIT 5 

...

(where (.*)(?<=order by)) 

나는 'where'와 'order by'또는 'limit'또는 'group by'사이의 모든 것을 얻고 싶었습니다. ...

누구나 저에게 조언이 있습니까? 나는 약간 수색을하고 이것 같이 아무것도를 찾아 내지 않는다. SQL Parser를 찾았지만 이러한 엔진은 완료하려는 작업에 비해 너무 큽니다.

감사합니다.

+1

일반적인 방법을 잘 모르지만 하나 이상의 where 절에주의해야합니다. 하위 쿼리에? – Paddy

+0

비슷한 문제가있어서 가장 가까운 곳은 (? :^| \)) (? : [^ \ (\)] + (?: \ s +) (. *?) (? : 그룹 별 | $) –

답변

2

.

더 나은 해결책은 AST을 생성하는 적절한 SQL 구문 분석기를 사용하는 것입니다. 그런 다음 WHERE 절을 추출 할 수 있습니다. T-SQL의 경우 bsn ModuleStore 프로젝트 (LGPL 라이센스)의 파서를 사용할 수 있습니다. 대서양 표준시를 수정하는 것은 쉽습니다. 그 후에는 명령문을 다시 스크립팅 할 수 있습니다.

+0

Lucero에 감사드립니다. 저는 JSQLParser를 사용할 것입니다. http://jsqlparser.sourceforge.net/ – LarZuK

+0

피드백에 감사드립니다. – Lucero

1

lookbind (? =) 어설 션이 필요한 반면 lookbehind (? < =)를 사용하고 있습니다.

여기에 more이 있습니다.

0

이것은 당신이 가고 얻을 수 있습니다 : 출력됩니다 WHERE columnA = 'B' AND columnB = 'C'

declare 
    sql_stmt varchar2(4000) := q'!SELECT * FROM myTbl WHERE columnA = 'B' AND columnB = 'C' ORDER BY columnX GROUP BY columnZ LIMIT 5!'; 

    where_stmt varchar2(4000) ; 

begin 
    where_stmt := regexp_replace(sql_stmt, '.*(WHERE.*?)ORDER BY.*', '\1'); 

    dbms_output.put_line(where_stmt); 

end; 
/

scriplet합니다. WHERE 절 (FOR XML와 함께 사용하면 예를 들어 어떤 경우에 ORDER BY를 포함 할 수있다 하위 쿼리 포함) 매우 복잡 할 수 있습니다, 그래서 당신은 정말 정규식과 항상 안정적으로 작동하는 솔루션을 찾을 수 없습니다 때문에