PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come funziona pg_typeof() in PostgreSQL

In PostgreSQL, il pg_typeof() la funzione ti consente di ottenere il tipo di dati di qualsiasi valore.

Più precisamente, restituisce l'OID del tipo di dati del valore che gli viene passato. Restituisce un regtype , che è un tipo di alias OID. Pertanto è uguale a un OID a scopo di confronto ma viene visualizzato come nome del tipo.

Sintassi

La funzione ha la seguente sintassi:

pg_typeof(any)

Dove any è qualsiasi valore.

Esempio

Ecco un esempio di base da dimostrare.

SELECT pg_typeof(100);

Risultato:

integer

Stringhe arbitrarie

In Postgres esiste più di un tipo di stringa (ad es. char , varchar , text ). Pertanto, non puoi semplicemente racchiudere un argomento tra virgolette singole e aspettarti che sappia qual è il suo tipo di dati.

SELECT pg_typeof('Elephant'); 

Risultato:

unknown

Pertanto dovrai specificare il tipo di dati effettivo.

SELECT pg_typeof('Elephant'::varchar); 

Risultato:

character varying

In Postgres, character varying è il nome di varchar (in realtà, varchar è l'alias per character varying ).

Quest'ultimo esempio è stato un po' superfluo, poiché ho dichiarato esplicitamente il tipo di variabile, il che significava che sapevo già quale sarebbe stato il risultato.

Nel mondo reale, è più probabile che tu stia cercando di ottenere il tipo di dati di una variabile.

Tipo di restituzione di una variabile

In questo esempio, inserisco la stringa precedente in una variabile, quindi ottengo il suo tipo di dati.

DO $$
DECLARE myString varchar(10) := 'Elephant';
BEGIN
 raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$

Risultato:

NOTICE: Value: Elephant
Type: character varying

Eccolo di nuovo, tranne per il fatto che cambio il tipo di dati in un tipo di stringa diverso (char(8) ).

DO $$
DECLARE myString char(8) := 'Elephant';
BEGIN
 raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$

Risultato:

NOTICE: Value: Elephant
Type: character

Valori booleani

Ecco un esempio di fornitura esplicita di un valore booleano.

SELECT 
  pg_typeof(true),
  pg_typeof(false); 

Risultato:

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

Tipo di restituzione di una funzione

Ancora una volta, è improbabile che fornirai esplicitamente true o false a questa funzione. È più probabile che provenga da una variabile.

Ma potresti anche usare pg_typeof() per scoprire il tipo restituito di una funzione.

Ecco un esempio.

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

Risultato:

boolean

In questo caso ho passato isfinite() funzione al pg_typeof() funzione come argomento.

Ed ecco un altro esempio. In questo ottengo il tipo di dati del valore restituito di make_date() funzione.

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

Risultato:

date

Tipo di dati di una colonna

Ecco un esempio di restituzione del tipo di dati di una colonna del database.

SELECT pg_typeof(last_update)
FROM actor
LIMIT 1;

Risultato:

timestamp without time zone

In questo caso ho controllato il tipo di dati di actor.last_update colonna nella pagila database di esempio.

Controlliamo un'altra colonna:

SELECT pg_typeof(name)
FROM language
LIMIT 1;

Risultato:

character

Questa colonna viene visualizzata come bpchar nella mia interfaccia, che apparentemente è il nome del tipo interno per CHAR(n) .

A proposito, puoi interrogare information_schema.columns per il tipo di dati di una colonna.

Pertanto, potremmo invece utilizzare la seguente query:

SELECT 
  column_name, 
  data_type 
FROM information_schema.columns
WHERE table_name = 'language';

Risultato:

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

In questo caso ho restituito il tipo di dati per tutte le colonne della tabella.