Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- WITH test (expr) AS (
- /*incorrect*/
- SELECT '((((a)g)q)' FROM dual UNION ALL
- SELECT 'z)(s)(' FROM dual UNION ALL
- SELECT '(((f)e)w))(h(g(w))' FROM dual UNION ALL
- SELECT ')(()' FROM dual UNION ALL
- SELECT '()))' FROM dual UNION ALL
- SELECT '(()()(()' FROM dual UNION ALL
- /*correct*/
- SELECT '(()((())()))' FROM dual UNION ALL
- SELECT '((t)!!er(q(qer()g)ffd())///)' FROM dual UNION ALL
- SELECT '(5 + x) * (y + 1) <= 10^(z + 2)' FROM dual UNION ALL
- SELECT '(((())))' FROM dual UNION ALL
- SELECT 'ффффвфывьав' FROM dual UNION ALL
- SELECT '(()()()())' FROM dual
- )
- SELECT expr, (SELECT MIN(INSTR(expr, ')', 1, level) - INSTR(expr, '(', 1, level))
- FROM dual
- CONNECT BY INSTR(expr, ')', 1, level) != 0
- OR INSTR(expr, '(', 1, level) != 0)
- FROM test
- WHERE
- /* Количество открывающих равно количеству закрывающих */
- (SELECT COUNT(SUBSTR(expr, level, 1))
- FROM dual
- WHERE SUBSTR(expr, level, 1) = '('
- CONNECT BY level <= LENGTH(expr))
- =
- (SELECT COUNT(SUBSTR(expr, level, 1))
- FROM dual
- WHERE SUBSTR(expr, level, 1) = ')'
- CONNECT BY level <= LENGTH(expr))
- /* Level-тая закрывающая скобка всегда правее level-той открывающей */
- AND
- (SELECT MIN(INSTR(expr, ')', 1, level) - INSTR(expr, '(', 1, level))
- FROM dual
- CONNECT BY INSTR(expr, ')', 1, level) != 0
- OR INSTR(expr, '(', 1, level) != 0)
- >= 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement