powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как расширить вторую размерности двумерного массива?
3 сообщений из 3, страница 1 из 1
как расширить вторую размерности двумерного массива?
    #40092742
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день.
помогите расширить вторую размерность двумерного массива.
размеры массива заранее не известны, поэтому array_fill(null::text, array[2,3]) не применим.
первую размерность расширяю стандартным "||".
подопытный код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DO 
$$declare
    p_StrArr text[][];
begin
--    p_StrArr:=array[['a1', 'b1', 'c1'], ['a2', 'b2', 'c2'] ];
--    p_StrArr:=array_fill(null::text, array[2,3]);
    p_StrArr[1][1]:='a1';
    p_StrArr:=p_StrArr || array['a2'];
    p_StrArr:=p_StrArr || array['a3'];
-- если расскомментировать, то
-- ERROR:  array subscript out of range
--    p_StrArr[1][2]:='b1';
    raise notice 'p_Str=%', p_StrArr; 
    raise notice 'p_Str=%', p_StrArr[1][1]; 
    raise notice 'p_Str=%', p_StrArr[2][1]; 
    raise notice 'c1=%', array_length(p_StrArr,1); 
    raise notice 'c2=%', array_length(p_StrArr,2); 
END$$;


спасибо.
...
Рейтинг: 0 / 0
как расширить вторую размерности двумерного массива?
    #40092860
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пока решил вопрос через ж... второй массив
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DO 
$$declare
    p_StrArr text[][];
    p_TmpArr text[][];
begin
    p_StrArr:=array[['a1', 'b1', 'c1'], ['a2', 'b2', 'c2'] ];
    raise notice 'p_Str=%', p_StrArr; 
    p_TmpArr:=array_fill(null::text, 
        array[array_length(p_StrArr,1),array_length(p_StrArr,2)+1]);
    for i in 1..array_length(p_StrArr,1) loop
        for j in 1..array_length(p_StrArr,2) loop
            p_TmpArr[i][j]:=p_StrArr[i][j];
        end loop;
    end loop;
    p_StrArr:=p_TmpArr;
    p_StrArr[1][4]:='d1';
    raise notice 'p_Str=%', p_StrArr; 
    raise notice 'c1=%', array_length(p_StrArr,1); 
    raise notice 'c2=%', array_length(p_StrArr,2); 
END$$;
...
Рейтинг: 0 / 0
как расширить вторую размерности двумерного массива?
    #40092881
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на стэке предложили более эффективный код, но все равно через промежуточный массив:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DO 
$$declare
    p_StrArr text[][];
    p_TmpArr text[][];
    p_TmpArr1 text[];
begin
    p_StrArr:=array[['a1', 'b1', 'c1'], ['a2', 'b2', 'c2'] ];
    raise notice 'p_Str=%', p_StrArr; 
    p_TmpArr:='{}';
    foreach p_TmpArr1 slice 1 in array p_StrArr a loop
        p_TmpArr := p_TmpArr || array[p_TmpArr1 || null::text];
    end loop;
    p_StrArr:=p_TmpArr;
    p_StrArr[1][4]:='d1';
    raise notice 'p_Str=%', p_StrArr; 
    raise notice 'c1=%', array_length(p_StrArr,1); 
    raise notice 'c2=%', array_length(p_StrArr,2); 
END$$;



мой код с поэлементным копированием на 1000 циклов тратит 946,801 мс, предложенный 26,929 мс
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как расширить вторую размерности двумерного массива?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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