Filtrare select gerarchiche usando i discendenti
Useremo la funzione sys_connect_by_path.
Esempio
select * from (
select code id_S,
trim(rpad(' ', (level - 1) * 4, '.')) || nome Nome_S,
level level_S,
sys_connect_by_path(code, '/') path_S
from tableName
start with code_mother = 0
connect by code_mother = PRIOR code
) where path_s not like '%filter%'
Spiegazione
La funzione SYS_CONNECT_BY_PATH può essere usata nelle query gerarchiche per costruire una stringa che rappresenti il path dalla root della gerarchia fino al record corrente.
SYS_CONNECT_BY_PATH lavora effettuando una concatenzione ricorsiva dei valori che restituisce ad ogni livello:
- path1 := string_expression1||format_string rappresenta il path dalla radice fino al primo resultset
- path2 := path1||string_expression2||format_string rappresenta il path dalla radice fino al secondo resultset
- . . .
- pathN := path(N-1)||string_expressionN||format_string rappresenta il path dalla radice fino al N-esimo resultset
I parametri passati a SYS_CONNECT_BY_PATH non possono contenere costrutti gerarchici, inclusi i seguenti:
- gli operatory unari CONNECT_BY_ROOT e PRIOR
- le pseudocolonne CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF, o LEVEL
- la funzione SYS_CONNECT_BY_PATH stessa
- espressioni aggregate di qualsiasi tipo
Il valore restituito da SYS_CONNECT_BY_PATH è un LVARCHAR(4000).