powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обход дерева условий на PL/SQL
8 сообщений из 8, страница 1 из 1
Обход дерева условий на PL/SQL
    #36822686
Refuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Помогите пожалуйста решить задачу (заранее прошу прощения, если поставлю не совсем понятное условие).
Существует таблица, со структурой данных в виде дерева:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
-----------------------------------------
WITH tbl_tree AS 
  (SELECT  1  id, NULL parent_id,  187  value, 'Условие 1' note, '=' operation, 'nVar1' variable FROM dual UNION ALL
   SELECT  2 ,   1 ,  4 , 'Условие 2',  '=',   'nVar2' FROM dual UNION ALL
   SELECT  3 ,   1 ,  8 , 'Условие 3',  '=',   'nVar3' FROM dual UNION ALL
   SELECT  4 ,   1 ,  5 , 'Условие 4',  '=',   'nVar2' FROM dual UNION ALL
   SELECT  5 ,   1 ,  9 , 'Условие 5',  '=',   'nVar3' FROM dual UNION ALL
   SELECT  6 ,   2 ,  0 , 'Условие 6',  '=',   'nVar4' FROM dual UNION ALL
   SELECT  7 ,   2 ,  0 , 'Условие 7',  '>',   'nVar5' FROM dual UNION ALL
   SELECT  8 ,   4 ,  0 , 'Условие 8',  '=',   'nVar5' FROM dual UNION ALL
   SELECT  9 ,   4 ,  0 , 'Условие 9',  '>',   'nVar5' FROM dual UNION ALL
   SELECT  10 ,  8 ,  5 , 'Условие 10', '!=',  'nVar6' FROM dual)
-----------------------------------------
SELECT id, -- первичный ключ
       parent_id, -- ссылка на родителя
       LPAD (' ', (LEVEL -  1 ) *  5 ) || note AS note, -- комментарий
       value, -- значение
       CONNECT_BY_ISLEAF, -- если есть потомки - 0, если потомков нет - 1
       operation, -- операция
       variable -- имя переменной
FROM tbl_tree
CONNECT BY prior id = parent_id
START WITH id =  1 ;
-----------------------------------------

Вот результат выполнения селекта:

IDPARENT_IDNOTEVALUECONNECT_BY_ISLEAFOPERATIONVARIABLE1Условие 11870=nVar121_____Условие 240=nVar262__________Условие 601=nVar472__________Условие 701>nVar531_____Условие 381=nVar341_____Условие 450=nVar284__________Условие 800=nVar5108_______________Условие 1051!=nVar694__________Условие 901>nVar551_____Условие 591=nVar3

Необходимо проверить ветви данного дерева (имя переменной, операция сравнения, значение, с которым нужно сравнивать берутся из таблицы). Т.е, другими словами, нам нужно по очереди проверить 4 ветви:

Код: plaintext
1.
2.
3.
4.
nVar1 =  187  AND nVar2 =  4  AND (nVar4 =  0  OR nVar5 >  0 )
nVar1 =  187  AND nVar3 =  8 
nVar1 =  187  AND nVar2 =  5  AND (nVar5 =  0  AND nVar6 !=  5  OR nVar5 >  0 )
nVar1 =  187  AND nVar3 =  9 

Достаточно дойти до первого CONNECT_BY_ISLEAF = 1 (потомков нет), при котором все предыдущие условия данной ветви сработали, чтобы все условие сработало.
Помогите пожалуйста с алгоритмом проверки ветвей на PL/SQL. Особенно вызывает затруднение реализация условия "OR".
Еще раз повторюсь, прошу прощения, но я вижу такое решение данной задачи. Может кто-нибудь знает другое?
Заранее благодарю за помощь.
...
Рейтинг: 0 / 0
Обход дерева условий на PL/SQL
    #36822693
Refuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, забыл псевдостолбец LEVEL. Я хотел как-то за него зацепиться при обработке условия "ИЛИ", т.к. LEVEL у этих подветвей будет одинаков.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
-----------------------------------------
WITH tbl_tree AS 
  (SELECT  1  id, NULL parent_id,  187  value, 'Условие 1' note, '=' operation, 'nVar1' variable FROM dual UNION ALL
   SELECT  2 ,   1 ,  4 , 'Условие 2',  '=',   'nVar2' FROM dual UNION ALL
   SELECT  3 ,   1 ,  8 , 'Условие 3',  '=',   'nVar3' FROM dual UNION ALL
   SELECT  4 ,   1 ,  5 , 'Условие 4',  '=',   'nVar2' FROM dual UNION ALL
   SELECT  5 ,   1 ,  9 , 'Условие 5',  '=',   'nVar3' FROM dual UNION ALL
   SELECT  6 ,   2 ,  0 , 'Условие 6',  '=',   'nVar4' FROM dual UNION ALL
   SELECT  7 ,   2 ,  0 , 'Условие 7',  '>',   'nVar5' FROM dual UNION ALL
   SELECT  8 ,   4 ,  0 , 'Условие 8',  '=',   'nVar5' FROM dual UNION ALL
   SELECT  9 ,   4 ,  0 , 'Условие 9',  '>',   'nVar5' FROM dual UNION ALL
   SELECT  10 ,  8 ,  5 , 'Условие 10', '!=',  'nVar6' FROM dual)
-----------------------------------------
SELECT id,
       parent_id,
       LPAD (' ', (LEVEL -  1 ) *  5 ) || note AS note,
       value,
       CONNECT_BY_ISLEAF,
       operation,
       variable,
       level
FROM tbl_tree
CONNECT BY prior id = parent_id
START WITH id =  1 ;
-----------------------------------------

IDPARENT_IDNOTEVALUECONNECT_BY_ISLEAFOPERATIONVARIABLELEVEL1Условие 11870=nVar1121_____Условие 240=nVar2262__________Условие 601=nVar4372__________Условие 701>nVar5331_____Условие 381=nVar3241_____Условие 450=nVar2284__________Условие 800=nVar53108_______________Условие 1051!=nVar6494__________Условие 901>nVar5351_____Условие 591=nVar32
...
Рейтинг: 0 / 0
Обход дерева условий на PL/SQL
    #36822701
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а где поле, отвечающее за признак OR/AND?
...
Рейтинг: 0 / 0
Обход дерева условий на PL/SQL
    #36822702
Refuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это же видно из дерева. Один уровень - OR.
...
Рейтинг: 0 / 0
Обход дерева условий на PL/SQL
    #36822707
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RefuserЭто же видно из дерева. Один уровень - OR.
Если следующая строка имеет уровень как у текущей, то OR, иначе AND (уровень следующий больше текущего) или окончание условия (уровень следующий меньше текущего).
...
Рейтинг: 0 / 0
Обход дерева условий на PL/SQL
    #36822708
Refuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex-ls
Если следующая строка имеет уровень как у текущей, то OR, иначе AND (уровень следующий больше текущего) или окончание условия (уровень следующий меньше текущего).

А если уровень тот же не у следующей строки, а например через несколько, как в примере... Нужен универсальный алгоритм.
...
Рейтинг: 0 / 0
Обход дерева условий на PL/SQL
    #36822711
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Refuseralex-ls
Если следующая строка имеет уровень как у текущей, то OR, иначе AND (уровень следующий больше текущего) или окончание условия (уровень следующий меньше текущего).

А если уровень тот же не у следующей строки, а например через несколько, как в примере... Нужен универсальный алгоритм.
Через несколько строк делается примерно также, просто проверяется не текущий уровень, а уже каким-то образом подобранный, чтобы обрабатывалась ситуация с вложенными условиями.
Однако проще для признака OR/AND использовать отдельное поле, а не уровень.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Обход дерева условий на PL/SQL
    #39544129
a.l.e.x.a.n.d.r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно пример как это собрать в одну строку со скобками?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обход дерева условий на PL/SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]