Update em campo do tipo date array

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Update em campo do tipo date array

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[]

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

_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Reply | Threaded
Open this post in threaded view
|

Re: Update em campo do tipo date array

Arthur Nascimento
2018-01-16 13:15 GMT-02:00 Edelson Regis de Lima <[hidden email]>:
> 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
_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Reply | Threaded
Open this post in threaded view
|

Re: Update em campo do tipo date array

Edelson Regis de Lima
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

Em 16 de janeiro de 2018 12:23, Arthur Nascimento <[hidden email]> escreveu:
2018-01-16 13:15 GMT-02:00 Edelson Regis de Lima <[hidden email]>:
> 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

_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Reply | Threaded
Open this post in threaded view
|

Re: Update em campo do tipo date array

Euler Taveira
Em 16 de janeiro de 2018 15:00, Edelson Regis de Lima
<[hidden email]> escreveu:
> 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
_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral