PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Развързване на масива с едно ниво

Обяснете

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]

връща същото като

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]

което е NULL. Цитирам документите по този въпрос:

По подразбиране долната граница на индексната стойност на размерите на масива се задава на единица.

0 няма специално значение тук. Освен това, с двуизмерни масиви, имате нужда от два индекса за да получите основен елемент. Като това:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]

Резултат:

2

Първата част от съобщението ви е малко неясна.

SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])

Резултат:

[1:3][1:3]

Това са две размери с 3 елемента (1 до 3) всеки (9 основни елемента).
Ако искате n-1 размери, то това е правилен резултат:

SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))

Резултат:

{1,2,3,4,5,6,7,8,9}

Това еедно измерение. unnest() винаги произвежда един основен елемент на ред. Не съм сигурен какъв точно резултат желаете. Вашият пример е просто още един двуизмерен масив с липсващ набор от къдрави скоби ... ?

{1,2,3}, {4,5,6}, {7,8,9}

Ако искате отрязък от масивата , опитайте тази нотация:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]

Резултат:

{{1,2,3},{4,5,6}}

Или това:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]

Резултат:

{{4,5}}

Засплескане резултатът (получете 1D масив):

  • Как да изберете 1d масив от 2d масив postgresql

Прочетете повече в ръководството тук.

Функция

По-късният тест показа, че тази функция plpgsql е много по-бързо. Изисква Postgres 9.1 или по-нова версия:

CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY)
  RETURNS SETOF ANYARRAY AS
$func$
BEGIN
   FOREACH a SLICE 1 IN ARRAY $1 LOOP
      RETURN NEXT;
   END LOOP;
END
$func$  LANGUAGE plpgsql IMMUTABLE;

Вижте:

  • Как бързо да премахнете 2d масив в 1d масив в PostgreSQL?

Това е подобрена и опростена версия на функцията, която Лукас публикува:

CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
  RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM   generate_subscripts($1,1) d1
    ,  generate_subscripts($1,2) d2
GROUP  BY d1
ORDER  BY d1
$func$  LANGUAGE sql IMMUTABLE;

За версии на Postgres <8.4, array_agg() не е инсталиран по подразбиране. Първо го създайте:

CREATE AGGREGATE array_agg(anyelement) (
 SFUNC=array_append,
 STYPE=anyarray,
 INITCOND='{}'
);

Също така, generate_subscripts() все още не е роден. Използвайте вместо това:

...
FROM   generate_series(array_lower($1,1), array_upper($1,1)) d1
    ,  generate_series(array_lower($1,2), array_upper($1,2)) d2
...

Обадете се:

SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);

Резултат

{1,2}
{3,4}
{5,6}

SQL Fiddle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да напиша ограничение относно максимален брой редове в postgresql?

  2. Създаване на студен режим на готовност за PostgreSQL с помощта на Amazon AWS

  3. Бавно хибернация за придобиване на Postgres връзка

  4. Как да добавите условен уникален индекс към PostgreSQL

  5. Как да зададете изчакване на израза за изпълнение на заявка