PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como pg_typeof() funciona no PostgreSQL


No PostgreSQL, o pg_typeof() A função permite que você obtenha o tipo de dados de qualquer valor.

Mais especificamente, ele retorna o OID do tipo de dado do valor que é passado para ele. Ele retorna um regtype , que é um tipo de alias OID. Portanto, é o mesmo que um OID para fins de comparação, mas é exibido como um nome de tipo.

Sintaxe


A função tem a seguinte sintaxe:
pg_typeof(any)

Onde any é qualquer valor.

Exemplo


Aqui está um exemplo básico para demonstrar.
SELECT pg_typeof(100);

Resultado:
integer

Strings arbitrárias


No Postgres, há mais de um tipo de string (por exemplo, char , varchar , text ). Portanto, você não pode simplesmente colocar um argumento entre aspas simples e esperar que ele saiba qual é seu tipo de dados.
SELECT pg_typeof('Elephant'); 

Resultado:
unknown

Portanto, você precisará especificar seu tipo de dados real.
SELECT pg_typeof('Elephant'::varchar); 

Resultado:
character varying

No Postgres, character varying é o nome de varchar (na verdade, varchar é o alias para character varying ).

Este último exemplo foi um pouco supérfluo, pois declarei explicitamente o tipo de variável, o que significava que eu já sabia qual seria o resultado.

No mundo real, é mais provável que você esteja tentando obter o tipo de dados de uma variável.

Tipo de retorno de uma variável


Neste exemplo, coloco a string anterior em uma variável e, em seguida, obtenho seu tipo de dados.
DO $$
DECLARE myString varchar(10) := 'Elephant';
BEGIN
 raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$

Resultado:
NOTICE: Value: Elephant
Type: character varying

Aqui está novamente, exceto que eu altero o tipo de dados para um tipo de string diferente (char(8) ).
DO $$
DECLARE myString char(8) := 'Elephant';
BEGIN
 raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$

Resultado:
NOTICE: Value: Elephant
Type: character

Valores booleanos


Aqui está um exemplo de fornecer explicitamente um valor booleano.
SELECT 
  pg_typeof(true),
  pg_typeof(false); 

Resultado:
 pg_typeof | pg_typeof
-----------+-----------
   boolean | boolean

Tipo de retorno de uma função


Novamente, é improvável que você forneça explicitamente true ou false a esta função. É mais provável que venha de uma variável.

Mas você também pode usar pg_typeof() para descobrir o tipo de retorno de uma função.

Aqui está um exemplo.
SELECT pg_typeof(isfinite(date '2020-07-18'));

Resultado:
boolean

Neste caso eu passei o isfinite() função para o pg_typeof() função como seu argumento.

E aqui está outro exemplo. Neste eu recebo o tipo de dados do valor de retorno do make_date() função.
SELECT pg_typeof(make_date('1999', '09', '19')); 

Resultado:
date

Tipo de dados de uma coluna


Aqui está um exemplo de retorno do tipo de dados de uma coluna de banco de dados.
SELECT pg_typeof(last_update)
FROM actor
LIMIT 1;

Resultado:
timestamp without time zone

Nesse caso, verifiquei o tipo de dados do actor.last_update coluna na pagila banco de dados de exemplo.

Vamos verificar outra coluna:
SELECT pg_typeof(name)
FROM language
LIMIT 1;

Resultado:
character

Esta coluna é exibida como bpchar na minha interface, que aparentemente é o nome do tipo interno para CHAR(n) .

A propósito, você pode consultar information_schema.columns para o tipo de dados de uma coluna.

Portanto, poderíamos usar a seguinte consulta:
SELECT 
  column_name, 
  data_type 
FROM information_schema.columns
WHERE table_name = 'language';

Resultado:
 column_name |          data_type          
-------------+-----------------------------
 language_id | integer
 name        | character
 last_update | timestamp without time zone

Nesse caso, retornei o tipo de dados para todas as colunas da tabela.