Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Central de ajuda/ Relational Database Service/ Melhores práticas/ RDS for PostgreSQL/ Conversão de tipo de dados definida pelo usuário
Atualizado em 2024-09-24 GMT+08:00

Conversão de tipo de dados definida pelo usuário

Descrição

Existem três modos de conversão de tipos de dados para o PostgreSQL: conversão implícita, conversão de atribuição e conversão explícita. Eles correspondem a i (implícita), a (atribuição) e e (explícita) no catálogo do sistema pg_cast.

  • Conversão implícita: uma conversão de bytes baixos para bytes altos do mesmo tipo de dados, por exemplo, de int para bigint
  • Conversão de atribuição: uma conversão de bytes altos para bytes baixos do mesmo tipo de dados, por exemplo, de smallint para int
  • Conversão explícita: uma conversão entre diferentes tipos de dados

Como usar

  1. Antes de converter tipos de dados, você pode executar o seguinte comando para verificar se o RDS for PostgreSQL suporta a conversão de tipos de dados:
    select * from pg_catalog.pg_cast ;
    oid  | castsource | casttarget | castfunc | castcontext | castmethod 
    -------+------------+------------+----------+-------------+------------
     11277 |         20 |         21 |      714 | a           | f
     11278 |         20 |         23 |      480 | a           | f
     11279 |         20 |        700 |      652 | i           | f
     11280 |         20 |        701 |      482 | i           | f
    ......
  2. Execute o seguinte comando para verificar se int4 pode ser convertido em text:
    select * from pg_catalog.pg_cast where castsource = 'int4'::regtype and casttarget = 'bool'::regtype;
      oid  | castsource | casttarget | castfunc | castcontext | castmethod 
    -------+------------+------------+----------+-------------+------------
     11311 |         23 |         16 |     2557 | e           | f
    (1 row)

    A conversão é suportada e o tipo de conversão é conversão implícita.

    Se nenhuma função de conversão interna estiver disponível, personalize uma função de conversão para suportar a conversão. Para mais detalhes, consulte Conversão de tipo de dados definida pelo usuário.

Conversão de tipo de dados definida pelo usuário

  • Use dois pontos duplos (::) para realizar uma conversão forçada.
    select '10'::int,'2023-10-05'::date;
     int4 |    date    
    ------+------------
       10 | 2023-10-05
    (1 row)
  • Use a função CAST para converter o tipo.
    select CAST('10' as int),CAST('2023-10-05' as date);
     int4 |    date    
    ------+------------
       10 | 2023-10-05
    (1 row)
  • Personalize uma conversão de tipo de dados.

    Para obter detalhes, consulte https://www.postgresql.org/docs/14/sql-createcast.html.

    A adição de uma conversão de tipo personalizada afetará os planos de execução existentes do RDS for PostgreSQL. Portanto, a personalização de conversões de tipo não é recomendada.

    • Conversão entre tempo e tipos de caracteres

      CREATE CAST(varchar as date) WITH INOUT AS IMPLICIT;

    • Conversão entre tipos booleanos e tipos numéricos

      create cast(boolean as numeric) with INOUT AS IMPLICIT;

    • Conversão entre tipos numéricos e tipos de caracteres

      create cast(varchar as numeric) with INOUT AS IMPLICIT;

    Exemplo: converter text em date.

    create or replace function public.text_to_date(text) returns date as 
    $$          
      select to_date($1,'yyyy-mm-dd');  
    $$ 
    language sql strict;  
    
    create cast (text as date) with function public.text_to_date(text) as implicit;  
    
    select text '2023-09-09' + 1;
      ?column?  
    ------------
     2023-09-10
    (1 row)