9.19. Funções e operadores de matriz #

Conforme visto na Seção 8.15, o tipo de dados matriz (array) é identificado anexando colchetes ([]) ao nome do tipo de dados dos elementos da matriz. [87]

A Tabela 9.56 descreve os operadores especializados disponíveis para as matrizes. Além desses, estão disponíveis para as matrizes os operadores de comparação usuais descritos na Tabela 9.1. Os operadores de comparação comparam o conteúdo da matriz elemento por elemento, usando a função de comparação de árvore-B padrão para o tipo de dados do elemento, e classificam com base na primeira diferença. Nas matrizes multidimensionais, os elementos são acessados na ordem principal de linha (row-major order) (o último índice varia mais rapidamente). Se o conteúdo das duas matrizes forem idênticos, mas suas dimensões forem diferentes, a primeira diferença nas informações de dimensão determinará a ordem de classificação.

Tabela 9.56. Operadores de matriz

Operador

Descrição

Exemplo(s)

anyarray @> anyarrayboolean

A primeira matriz contém a segunda matriz, ou seja, cada elemento que aparece na segunda matriz é igual a algum elemento da primeira matriz? (Duplicados não são tratados de forma especial, portanto ARRAY[1] e ARRAY[1,1] são considerados contendo um ao outro.)

ARRAY[1,4,3] @> ARRAY[3,1,3]t

anyarray <@ anyarrayboolean

A primeira matriz está contida na segunda matriz?

ARRAY[2,2,7] <@ ARRAY[1,7,4,2,6]t

anyarray && anyarrayboolean

As matrizes se sobrepõem, ou seja, têm algum elemento em comum?

ARRAY[1,4,3] && ARRAY[2,1]t

anycompatiblearray || anycompatiblearrayanycompatiblearray

Concatena as duas matrizes. Concatenar uma matriz nula ou uma matriz vazia é uma operação vazia (no-op); caso contrário, as matrizes devem ter o mesmo número de dimensões (como mostrado no primeiro exemplo), ou diferirem em número de dimensões por um (como mostrado no segundo exemplo). Se as matrizes não tiverem elementos de tipos de dados idênticos, os tipos de dados serão forçados a ter um tipo de dados comum (veja a Seção 10.5).

ARRAY[1,2,3] || ARRAY[4,5,6,7]{1,2,3,4,5,6,7}

ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9.9]]{{1,2,3},{4,5,6},{7,8,9.9}}

anycompatible || anycompatiblearrayanycompatiblearray

Concatena um elemento no início da matriz (que deve ser vazia ou unidimensional).

3 || ARRAY[4,5,6]{3,4,5,6}

anycompatiblearray || anycompatibleanycompatiblearray

Concatena um elemento no fim da matriz (que deve ser vazia ou unidimensional).

ARRAY[4,5,6] || 7{4,5,6,7}


Veja a Seção 8.15 para obter mais detalhes sobre o comportamento de operador de matriz. Veja a Seção 11.2 para obter mais detalhes sobre quais operadores suportam operações com índices.

A Tabela 9.57 descreve as funções disponíveis para uso com matrizes. Veja a Seção 8.15 para obter mais informações e exemplos do uso dessas funções.

Tabela 9.57. Funções de matriz

Função

Descrição

Exemplo(s)

array_append ( anycompatiblearray, anycompatible ) → anycompatiblearray

Acrescenta um elemento ao final de uma matriz (idêntico ao que o operador anycompatiblearray || anycompatible faz).

array_append(ARRAY[1,2], 3){1,2,3}

array_cat ( anycompatiblearray, anycompatiblearray ) → anycompatiblearray

Concatena duas matrizes (idêntico ao que o operador anycompatiblearray || anycompatiblearray faz).

array_cat(ARRAY[1,2,3], ARRAY[4,5]){1,2,3,4,5}

array_dims ( anyarray ) → text

Retorna a representação em forma de texto das dimensões da matriz.

array_dims(ARRAY[[1,2,3], [4,5,6]])[1:2][1:3]

array_fill ( anyelement, integer[] [, integer[] ] ) → anyarray

Retorna uma matriz preenchida com cópias do valor fornecido, com as dimensões dos comprimentos especificados pelo segundo argumento. O terceiro argumento, opcional, fornece valores de limite inferior para cada dimensão (cujo padrão é 1).

array_fill(11, ARRAY[2,3]){{11,11,11},{11,11,11}}

array_fill(7, ARRAY[3], ARRAY[2])[2:4]={7,7,7}

array_length ( anyarray, integer ) → integer

Retorna o comprimento da dimensão solicitada da matriz. (Retorna NULL, em vez de 0, para dimensões de matriz vazias ou ausentes.)

array_length(array[1,2,3], 1)3

array_length(array[]::int[], 1)NULL

array_length(array['text'], 2)NULL

array_lower ( anyarray, integer ) → integer

Retorna o limite inferior da dimensão solicitada da matriz.

array_lower('[0:2]={1,2,3}'::integer[], 1)0

array_ndims ( anyarray ) → integer

Retorna o número de dimensões da matriz.

array_ndims(ARRAY[[1,2,3], [4,5,6]])2

array_position ( anycompatiblearray, anycompatible [, integer ] ) → integer

Retorna o índice da primeira ocorrência do segundo argumento na matriz, ou NULL se não estiver presente. Se o terceiro argumento for fornecido, a procura começará nesse índice. A matriz deve ser unidimensional. As comparações são feitas usando a semântica IS NOT DISTINCT FROM, então é possível procurar por NULL.

array_position(ARRAY['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sab'], 'seg')2

array_positions ( anycompatiblearray, anycompatible ) → integer[]

Retorna uma matriz contendo os índices de todas as ocorrências do segundo argumento na matriz fornecida como primeiro argumento. A matriz deve ser unidimensional. As comparações são feitas usando a semântica IS NOT DISTINCT FROM, então é possível procurar por NULL. Só é retornado NULL se a matriz for NULL; se o valor não for encontrado na matriz, será retornada uma matriz vazia.

array_positions(ARRAY['A','A','B','A'], 'A'){1,2,4}

array_prepend ( anycompatible, anycompatiblearray ) → anycompatiblearray

Anexa um elemento ao início de uma matriz (idêntico ao que o operador anycompatible || anycompatiblearray faz).

array_prepend(1, ARRAY[2,3]){1,2,3}

array_remove ( anycompatiblearray, anycompatible ) → anycompatiblearray

Remove da matriz todos os elementos iguais ao valor fornecido. A matriz deve ser unidimensional. As comparações são feitas usando a semântica IS NOT DISTINCT FROM, então é possível remover NULL.

array_remove(ARRAY[1,2,3,2], 2){1,3}

array_replace ( anycompatiblearray, anycompatible, anycompatible ) → anycompatiblearray

Substitui cada elemento da matriz igual ao segundo argumento pelo terceiro argumento.

array_replace(ARRAY[1,2,5,4], 5, 3){1,2,3,4}

array_reverse ( anyarray ) → anyarray

Inverte a primeira dimensão da matriz.

array_reverse(ARRAY[[1,2],[3,4],[5,6]]){{5,6},{3,4},{1,2}}

array_sample ( array anyarray, n integer ) → anyarray

Retorna uma matriz de n itens selecionados aleatoriamente da matriz array. n não pode exceder o valor da primeira dimensão da matriz array. Se a matriz array for multidimensional, um item será uma fatia possuindo como primeira dimensão o valor fornecido.

array_sample(ARRAY[1,2,3,4,5,6], 3){2,6,1}

array_sample(ARRAY[[1,2],[3,4],[5,6]], 2){{5,6},{1,2}}

array_sample(ARRAY[[1,2,3],[3,4,5],[5,6,7]], 2) {{5,6,7},{1,2,3}}

array_shuffle ( anyarray ) → anyarray

Mistura aleatoriamente a primeira dimensão da matriz.

array_shuffle(ARRAY[[1,2],[3,4],[5,6]]){{5,6},{1,2},{3,4}}

array_shuffle(ARRAY[[1,2,3],[3,4,5],[5,6,7]]){{1,2,3},{5,6,7},{3,4,5}}

array_sort ( array anyarray [, descending boolean [, nulls_first boolean ]] ) → anyarray

Ordena a primeira dimensão da matriz. A ordem de classificação é determinada pela ordem de classificação padrão do tipo de dados do elemento da matriz; entretanto, se o tipo de dados do elemento for ordenável, a ordenação a ser usada pode ser especificada adicionando uma cláusula COLLATE ao argumento matriz array.

Se descending for verdade, então a ordenação será feita em ordem decrescente; caso contrário, será na ordem crescente. Se for omitido, o padrão é a ordem crescente. Se nulls_first for verdade, os valores nulos aparecem antes dos valores não nulos; caso contrário, os valores nulos aparecem depois dos valores não nulos. Se for omitido, nulls_first é considerado como tendo o mesmo valor que descending.

array_sort(ARRAY[[2,4],[2,1],[6,5]]){{2,1},{2,4},{6,5}}

array_sort(ARRAY[[3,4,5],[5,6,7],[1,2,3]]){{1,2,3},{3,4,5},{5,6,7}}

array_to_string ( array anyarray, delimiter text [, null_string text ] ) → text

Converte cada elemento da matriz em sua representação de texto, e concatena aqueles separados pela cadeia de caracteres presente em delimiter. Se for especificada a cadeia de caracteres null_string, e não for NULL, então os valores NULL da matriz serão representados por esta cadeia de caracteres; caso contrário, os valores NULL serão omitidos. Veja também a função string_to_array.

array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*')1,2,3,*,5

array_upper ( anyarray, integer ) → integer

Retorna o limite superior da dimensão solicitada da matriz.

array_upper(ARRAY[1,8,3,7], 1)4

cardinality ( anyarray ) → integer

Retorna o número total de elementos na matriz, ou 0 se a matriz estiver vazia.

cardinality(ARRAY[[1,2],[3,4]])4

trim_array ( array anyarray, n integer ) → anyarray

Corta uma matriz removendo os últimos n elementos. Se a matriz for multidimensional, apenas a primeira dimensão será cortada.

trim_array(ARRAY[1,2,3,4,5,6], 2){1,2,3,4}

unnest ( anyarray ) → setof anyelement

Expande uma matriz em um conjunto de linhas. Os elementos da matriz são lidos na ordem de armazenamento.

unnest(ARRAY[1,2])

 1
 2

unnest(ARRAY[['foo','bar'],['baz','quux']])

 foo
 bar
 baz
 quux

unnest ( anyarray, anyarray [, ... ] ) → setof anyelement, anyelement [, ... ]

Expande várias matrizes (possivelmente de tipos de dados diferentes) em um conjunto de linhas. Se nem todas as matrizes tiverem o mesmo comprimento, as mais curtas serão preenchidas com o valor NULL. Esta forma só é permitida na cláusula FROM da consulta; veja a Seção 7.2.1.4.

select * from unnest(ARRAY[1,2], ARRAY['foo','bar','baz']) as x(a,b)

 a |  b
---+-----
 1 | foo
 2 | bar
   | baz


Veja também na Seção 9.21 a função de agregação para uso com matrizes array_agg.

Exemplo 9.5. Exemplo do tradutor

Este exemplo mostra o uso das funções e operadores para matrizes tomando como base uma matriz de Hankel.

Uma matriz de Hankel é uma matriz onde os elementos ao longo de cada anti-diagonal são iguais. Se c for a primeira coluna da matriz de Hankel e r for a última linha da matriz de Hankel, então p = [c r(2:end)] determina completamente todos os elementos da matriz de Hankel usando o mapeamento Hi,j = pi+j-1. Todas as matrizes de Hankel quadradas são simétricas. MathWorks MATLAB.

-- Esta função retorna uma matriz de Hankel com a primeira coluna
-- variando de 1 a N, e a última linha variando de N a (N + M - 1),
-- onde N e M são as dimensões da matriz.
CREATE OR REPLACE FUNCTION hankel (n int, m int)
    RETURNS int[][] LANGUAGE plpgsql AS $$
DECLARE
    i int;
    j int;
    matriz int[][];
BEGIN
    matriz = array_fill(0, array[n,m]);
    FOR i IN 1..n LOOP
        FOR j IN 1..m LOOP
            matriz[i][j] = i + j - 1;
        END LOOP;
    END LOOP;
    RETURN matriz;
END $$;

SELECT hankel(3,4);
             hankel
---------------------------------
 {{1,2,3,4},{2,3,4,5},{3,4,5,6}}
(1 linha)
SELECT array_dims(hankel(3,4));
 array_dims
------------
 [1:3][1:4]
(1 linha)
SELECT array_ndims(hankel(3,4));
 array_ndims
-------------
           2
(1 linha)
SELECT array_to_string(hankel(3,4), ';');
     array_to_string
-------------------------
 1;2;3;4;2;3;4;5;3;4;5;6
(1 linha)
SELECT cardinality(hankel(3,4));
 cardinality
-------------
          12
(1 linha)
SELECT trim_array(hankel(3,4), 1);
      trim_array
-----------------------
 {{1,2,3,4},{2,3,4,5}}
(1 linha)
SELECT hankel(3,12) @> hankel(3,4) AS contém;
 contém
--------
 t
(1 linha)
SELECT hankel(3,12) && hankel(3,4) AS sobrepõem;
 sobrepõem
-----------
 t
(1 linha)
SELECT hankel(3,4) || hankel(3,4) AS concatenação;
                         concatenação
---------------------------------------------------------------
 {{1,2,3,4},{2,3,4,5},{3,4,5,6},{1,2,3,4},{2,3,4,5},{3,4,5,6}}
(1 linha)
SELECT array_reverse(hankel(3,4)) AS inversão;
            inversão
---------------------------------
 {{3,4,5,6},{2,3,4,5},{1,2,3,4}}
(1 linha)
SELECT array_sample(hankel(3,4),2) AS amostra;
        amostra
-----------------------
 {{1,2,3,4},{3,4,5,6}}
(1 linha)
SELECT array_shuffle(hankel(3,4)) AS mistura;
             mistura
---------------------------------
 {{3,4,5,6},{2,3,4,5},{1,2,3,4}}
(1 linha)



[87] IBM DB2 Array values: Uma matriz é uma estrutura que contém uma coleção ordenada de elementos de dados, onde cada elemento pode ser referenciado pelo valor de seu índice na coleção. A cardinalidade de uma matriz é o número de elementos na matriz. Todos os elementos em uma matriz têm o mesmo tipo de dados. (N. T.)