sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo funciona pg_typeof() en PostgreSQL

En PostgreSQL, el pg_typeof() La función le permite obtener el tipo de datos de cualquier valor.

Más específicamente, devuelve el OID del tipo de datos del valor que se le pasa. Devuelve un regtype , que es un tipo de alias OID. Por lo tanto, es lo mismo que un OID a efectos de comparación, pero se muestra como un nombre de tipo.

Sintaxis

La función tiene la siguiente sintaxis:

pg_typeof(any)

Donde any es cualquier valor.

Ejemplo

Aquí hay un ejemplo básico para demostrarlo.

SELECT pg_typeof(100);

Resultado:

integer

Cadenas arbitrarias

En Postgres, hay más de un tipo de cadena (por ejemplo, char , varchar , text ). Por lo tanto, no puede simplemente encerrar un argumento entre comillas simples y esperar que sepa cuál es su tipo de datos.

SELECT pg_typeof('Elephant'); 

Resultado:

unknown

Por lo tanto, deberá especificar su tipo de datos real.

SELECT pg_typeof('Elephant'::varchar); 

Resultado:

character varying

En Postgres, character varying es el nombre de varchar (en realidad, varchar es el alias para character varying ).

Este último ejemplo fue un poco superfluo, ya que declaré explícitamente el tipo de variable, lo que significaba que ya sabía cuál iba a ser el resultado.

En el mundo real, es más probable que intente obtener el tipo de datos de una variable.

Tipo de retorno de una variable

En este ejemplo, coloco la cadena anterior en una variable y luego obtengo su tipo de datos.

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

Aquí está de nuevo, excepto que cambio el tipo de datos a un tipo de cadena 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

Este es un ejemplo de proporcionar un valor booleano de forma explícita.

SELECT 
  pg_typeof(true),
  pg_typeof(false); 

Resultado:

 pg_typeof | pg_typeof
-----------+-----------
   boolean | boolean

Tipo de retorno de una función

Nuevamente, es poco probable que proporcione explícitamente true o false a esta función. Es más probable que provenga de una variable.

Pero también podrías usar pg_typeof() para averiguar el tipo de devolución de una función.

He aquí un ejemplo.

SELECT pg_typeof(isfinite(date '2020-07-18'));

Resultado:

boolean

En este caso pasé el isfinite() función al pg_typeof() funcionar como su argumento.

Y aquí hay otro ejemplo. En este obtengo el tipo de datos del valor de retorno de make_date() función.

SELECT pg_typeof(make_date('1999', '09', '19')); 

Resultado:

date

Tipo de datos de una columna

Este es un ejemplo de cómo devolver el tipo de datos de una columna de base de datos.

SELECT pg_typeof(last_update)
FROM actor
LIMIT 1;

Resultado:

timestamp without time zone

En este caso verifiqué el tipo de datos del actor.last_update columna en la pagila base de datos de ejemplo.

Revisemos otra columna:

SELECT pg_typeof(name)
FROM language
LIMIT 1;

Resultado:

character

Esta columna se muestra como bpchar en mi interfaz, que aparentemente es el nombre de tipo interno para CHAR(n) .

Por cierto, puedes consultar information_schema.columns para el tipo de datos de una columna.

Por lo tanto, podríamos usar la siguiente consulta en su lugar:

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

En este caso, devolví el tipo de datos para todas las columnas de la tabla.