2014-11-15 2 views
1

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

например

((Состояние и условия) ИЛИ (Состояние))

 
Id ConditionType Value   Brackets 
1  NULL  NULL   (
2  NULL  NULL   (
3  NULL  Condition  NULL 
4  AND   NULL   NULL 
5  NULL  Condition  NULL 
6  NULL  NULL   ) 
7  OR   NULL   NULL 
8  NULL  NULL   (
9  NULL  Condition  NULL 
10  NULL  NULL   ) 
11  NULL  NULL   ) 

Из приведенной выше информации, мне нужно, чтобы сформировать индекс, как:

 
Id StartIndex EndIndex 
1  1   11 
2  2   6 
3  8   10 

Пожалуйста, подсказывают, как легко это может быть сделано.

+5

Пожалуйста, не просто попросите нас решить проблему для вас. Покажите нам, как _you_ попытался решить проблему самостоятельно, а затем покажите нам _exactly_, каким был результат, и скажите, почему вы считаете, что это не сработало. См. «[Что вы пробовали?] (Http://whathaveyoutried.com/)» за отличную статью, которую вы действительно должны прочитать. –

+1

Как вывод поступает из ввода данных образца? дайте некоторую идею – Ajay2707

ответ

1

Редактировать: В 1-й версии я пропустил с учетом вложенных уровней. Этот я тестировал :)

Я работаю над DB2, поэтому вам, вероятно, придется реорганизовать это для sql-сервера, если он не поддерживает LATERAL-соединение, но этот результат дал правильные результаты с вашим набором значений по DB2:

with CTE_ONLY_BRACKETS as (
    select * 
    from MYLIST 
    where Brackets in('(',')') 
) , 

CTE_NEST_INCREMENT as (
    select Id 
      ,Brackets 
      ,case when Brackets = '(' then 1 else -1 end as NEST_INCREMENT 
    from  CTE_ONLY_BRACKETS 
) , 

CTE_NEST_LEVEL as (
    select Id 
      ,Brackets 
      ,S.NEST_LEVEL 
    from  CTE_NEST_INCREMENT C 
    cross join lateral (
    select sum(NEST_INCREMENT) as NEST_LEVEL 
    from CTE_NEST_INCREMENT S 
    where S.Id <= C.Id 
) as S 

) 

select row_number() over() as Id 
     ,L.Id as StartIndex 
     ,R.Id as EndIndex 
from  CTE_NEST_LEVEL R 

cross join lateral (
    select L.Id 
    from CTE_NEST_LEVEL L 
    where L.Brackets = '(' 
    and L.Id < R.Id 
    and L.NEST_LEVEL = R.NEST_LEVEL + 1 
    order by L.Id desc 
    fetch first row only 
) as L 

where R.Brackets = ')' 

order by L.Id 
+0

Ваш запрос выполняется просто отлично на сервере Sql. Он дает в качестве выхода (1, 1, 11), (2, 2, 10), (3, \t 8, 6). Я думаю, что это не желаемый результат. –

+0

Интересно. Какая версия DB2 поддерживает боковые соединения? –

+0

Я работаю над DB2 на System i в версии V7R1, которая поддерживает боковые соединения. –

Смежные вопросы