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.