Discussion:
[pgbr-geral] Update em campo do tipo date array
Edelson Regis de Lima
2018-01-16 15:15:16 UTC
Permalink
Boa tarde pessoal.

Estou apanhando um pouco para dar um Replace em uma data dentro de um campo
do tipo date[]

Exemplo: digamos que meu campo occurrencedates date[] tenha as três datas:
[2018-02-01,2018-02-02,2018-02-03]
Quero por exemplo apagar o que for 2018-02-03 em todos os registros em que
a mesma for encontrada.
Para encontrar o registro estou fazendo um cast para string e usando o
ilike.
No select eu consigo retornar já sem a data normalmente.
O problema está na hora de dar o Update, não estou conseguindo converter
corretamente para que o postgre entenda que é um array de data.

Para fazer um select:

select
occurrencedates as com_a_data,
string_to_array(replace(array_to_string(occurrencedates, ','),
'2018-02-03', ''), ',') sem_a_data
FROM minha_tabela
where
(occurrencedates::varchar ilike '%2018-02-03%')

com_a_data | sem_a_data
"{2018-02-01,2018-02-02,2018-02-03}" | "{2018-02-01,2018-02-02,""}"

Ou seja, o resultado sem_a_data já é um array.

Daí eu tento fazer:

update minha_minha
set occurrencedates =
string_to_array(replace(array_to_string(occurrencedates, ','),
'2018-02-03', ''), ',') where (occurrencedates::varchar ilike
'%2018-02-03%')

E dá o seguinte erro:
column "occurrencedates" is of type date[] but expression is of type text[]

Ou seja, tenho que converter de alguma maneira o text[] para date[]

Se alguém puder ajudar agradeço desde já.

Abraços
--
*Edelson Regis de Lima*
Arthur Nascimento
2018-01-16 15:23:50 UTC
Permalink
Post by Edelson Regis de Lima
Boa tarde pessoal.
Estou apanhando um pouco para dar um Replace em uma data dentro de um campo
do tipo date[]
Use array_replace(), array_remove() e todas as outras opções para
trabalhar diretamente com arrays. Não fique convertendo para texto.


https://www.postgresql.org/docs/current/static/functions-array.html



Tureba - Arthur Nascimento
Edelson Regis de Lima
2018-01-16 18:00:54 UTC
Permalink
Boa tarde Arthur.

Então, essa seria a solução ideal, o problema é que a versão do banco é
9.1, e essas funções estão disponíveis a partir da 9.3.
E no momento não tenho como atualizar o BD...
Será que teria uma outra maneira?

Grato,

Edelson
Post by Edelson Regis de Lima
Boa tarde pessoal.
Estou apanhando um pouco para dar um Replace em uma data dentro de um
campo
Post by Edelson Regis de Lima
do tipo date[]
Use array_replace(), array_remove() e todas as outras opções para
trabalhar diretamente com arrays. Não fique convertendo para texto.
https://www.postgresql.org/docs/current/static/functions-array.html
Tureba - Arthur Nascimento
Euler Taveira
2018-01-16 21:35:27 UTC
Permalink
Em 16 de janeiro de 2018 15:00, Edelson Regis de Lima
Então, essa seria a solução ideal, o problema é que a versão do banco é 9.1,
e essas funções estão disponíveis a partir da 9.3.
E no momento não tenho como atualizar o BD...
A versão 9.1 foi descontinuada a mais de 1 ano. Isso significa que não
há versões corretivas para a mesma. Planeje o quanto antes a migração
para uma versão recente (a última é a versão 10).
Será que teria uma outra maneira?
Basta criar uma função.

euler=# \! cat /tmp/a.sql
CREATE OR REPLACE FUNCTION array_remove(a date[], b date) RETURNS date[] AS
$$
DECLARE
r date[];
x date;
BEGIN
FOREACH x IN ARRAY a
LOOP
IF x <> b THEN
r := array_append(r, x);
END IF;
END LOOP;

RETURN r;
END;
$$ LANGUAGE plpgsql;
euler=# \i /tmp/a.sql
CREATE FUNCTION
euler=# create table foo (a date[]);
CREATE TABLE
euler=# insert into foo values('{''2018-01-01'', ''2018-01-02'',
''2018-01-10''}');
INSERT 0 1
euler=# select a from foo;
a
------------------------------------
{2018-01-01,2018-01-02,2018-01-10}
(1 row)

euler=# select array_remove(a, '2018-01-01') from foo;
array_remove
-------------------------
{2018-01-02,2018-01-10}
(1 row)
--
Euler Taveira Timbira -
http://www.timbira.com.br/
PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
Loading...