Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / снова про деревья / 9 сообщений из 9, страница 1 из 1
28.11.2007, 14:18
    #34971815
непонимайу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова про деревья
Код: 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.
26.
--drop table test;

create table test
(id int,
 id_parent int ,
 name      varchar( 50 ));

insert into test values( 1 , null, 'соки-воды');
insert into test values( 2 ,  1 , 'вода такая');
insert into test values( 3 ,  1 , 'вода сякая');
insert into test values( 4 , null, 'техника');
insert into test values( 5 ,  4 , 'цифровая');
insert into test values( 6 ,  5 , 'фотооаппарты');

select case  when id_parent is null then name
             else func(id_parent) end
from test;

надо получить такой результат:

соки-воды
соки-воды, вода такая
соки-воды, вода сякая
техника
техника, цифровая
техника, цифровая, фотооаппарты
не доходит, как переделать функцию выбора предков, для этого%)
ltree начал смотреть.
...
Рейтинг: 0 / 0
28.11.2007, 15:14
    #34972084
Oleg Bartunov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова про деревья
непонимайу
Код: 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.
26.
--drop table test;

create table test
(id int,
 id_parent int ,
 name      varchar( 50 ));

insert into test values( 1 , null, 'соки-воды');
insert into test values( 2 ,  1 , 'вода такая');
insert into test values( 3 ,  1 , 'вода сякая');
insert into test values( 4 , null, 'техника');
insert into test values( 5 ,  4 , 'цифровая');
insert into test values( 6 ,  5 , 'фотооаппарты');

select case  when id_parent is null then name
             else func(id_parent) end
from test;

надо получить такой результат:

соки-воды
соки-воды, вода такая
соки-воды, вода сякая
техника
техника, цифровая
техника, цифровая, фотооаппарты
не доходит, как переделать функцию выбора предков, для этого%)
ltree начал смотреть.

смотри и тебе будет счастье.
...
Рейтинг: 0 / 0
28.11.2007, 15:15
    #34972092
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова про деревья
Лучше посмотрите contrib tablefunc функцию connectby .
...
Рейтинг: 0 / 0
29.11.2007, 09:27
    #34973751
zuxul
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова про деревья
Нет PostgreSQL, только Oracle, но думаю эквивалент nvl() в PostgreSQL точно есть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 
       nvl(t2.name,t1.name) n2,
       case when t1.id_parent is not null 
            then
                t1.name 
            end n1
                from test t1
left join test t2
on t1.id_parent=t2.id
order by n2, n1 nulls first
...
Рейтинг: 0 / 0
29.11.2007, 10:52
    #34974026
непонимайу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова про деревья
Oleg Bartunovсмотри и тебе будет счастье.посмотрел, не обрел). Вы соавтор ltree?
Thamerlan Лучше посмотрите contrib tablefunc функцию connectby.не непонял, как в branch вставить поле name, а id-ки через запятую не нужны
Код: plaintext
1.
SELECT * FROM connectby('test', 'id', 'id_parent', '1',  0 , ', ')
 AS t(keyid text, parent_keyid text, level int, branch  text);
"1";"" ;0; "1"
"2";"1";1;"1, 2"
"3";"1";1;"1, 3"
к тому мне нужна одна строка, а не набор.
zuxulНет PostgreSQL, только Oracle, но думаю эквивалент nvl() в PostgreSQL точно естьна pg это будет так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 
       NULLIF(t2.name,t1.name) as n2,
       case when t1.id_parent is not null 
            then
                t1.name 
            end as n1
                from test t1
left join test t2
on t1.id_parent=t2.id
order by n2, n1 
но это не то, что надо

пошел изобретать велосипед...
...
Рейтинг: 0 / 0
29.11.2007, 11:26
    #34974157
zuxul
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова про деревья
непонимайуно это не то, что надо
Да, протупил - не заметил фотоаппараты :)
...
Рейтинг: 0 / 0
29.11.2007, 11:30
    #34974177
.:Ajvol:.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова про деревья
непонимайуна pg это будет так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 
       NULLIF(t2.name,t1.name) as n2,
       case when t1.id_parent is not null 
            then
                t1.name 
            end as n1
                from test t1
left join test t2
on t1.id_parent=t2.id
order by n2, n1 
но это не то, что надо



ISNULL - MSSQL (из двух значений выбирает то, которое NOT NULL)
NVL - ORACLE
IFNULL - MySQL
COALESCE - POSTGRESQL (выбирает первое NOT NULL из списка произвольной длины)

NULLIF - это обратная операция - выдаёт NULL, если первый аргумент равен второму
...
Рейтинг: 0 / 0
29.11.2007, 11:32
    #34974183
снова про деревья
А если так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR REPLACE FUNCTION "get_tree_values" (_id integer, out _name varchar) RETURNS varchar AS
$body$
DECLARE
    full_name varchar; 
    nm varchar;  
    _id_parent integer;
BEGIN
    SELECT id_parent, name INTO _id_parent,full_name FROM test WHERE id = _id;  
    IF (_id_parent IS NULL) THEN 
    	_name =  full_name;    
	  	RETURN;
    END IF; 

    SELECT get_tree_values(_id_parent) INTO nm;
     full_name = full_name || ', ' ||  nm; 
    _name =  full_name;
    RETURN;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Код: plaintext
select id, get_tree_values(id) FROM test

Только в этом варианте в обратном порядке значения пойдут.
'Фотоаппараты, цифровая, техника'
...
Рейтинг: 0 / 0
29.11.2007, 12:07
    #34974338
непонимайу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
снова про деревья
Золотая рыбкаА если так?красиво. спасибо.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / снова про деревья / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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