In PostgreSQL is de pg_typeof()
functie stelt u in staat om het gegevenstype van elke waarde te krijgen.
Meer specifiek retourneert het de OID van het gegevenstype van de waarde die eraan wordt doorgegeven. Het retourneert een regtype
, wat een OID-aliastype is. Daarom is het hetzelfde als een OID voor vergelijkingsdoeleinden, maar wordt het weergegeven als een typenaam.
Syntaxis
De functie heeft de volgende syntaxis:
pg_typeof(any)
Waar any
enige waarde is.
Voorbeeld
Hier is een eenvoudig voorbeeld om te demonstreren.
SELECT pg_typeof(100);
Resultaat:
integer
Willekeurige tekenreeksen
In Postgres is er meer dan één type tekenreeks (bijv. char
, varchar
, text
). Daarom kun je een argument niet zomaar tussen enkele aanhalingstekens plaatsen en verwachten dat het weet wat het gegevenstype is.
SELECT pg_typeof('Elephant');
Resultaat:
unknown
Daarom moet u het werkelijke gegevenstype opgeven.
SELECT pg_typeof('Elephant'::varchar);
Resultaat:
character varying
In Postgres, character varying
is de naam voor varchar
(eigenlijk varchar
is de alias voor character varying
).
Dit laatste voorbeeld was een beetje overbodig, omdat ik het variabele type expliciet vermeldde, waardoor ik al wist wat het resultaat zou worden.
In de echte wereld is de kans groter dat u probeert het gegevenstype van een variabele te krijgen.
Retourtype van een variabele
In dit voorbeeld plaats ik de vorige string in een variabele en haal dan het datatype op.
DO $$
DECLARE myString varchar(10) := 'Elephant';
BEGIN
raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$
Resultaat:
NOTICE: Value: Elephant Type: character varying
Hier is het weer, behalve dat ik het gegevenstype verander in een ander tekenreekstype (char(8)
).
DO $$
DECLARE myString char(8) := 'Elephant';
BEGIN
raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$
Resultaat:
NOTICE: Value: Elephant Type: character
Booleaanse waarden
Hier is een voorbeeld van het expliciet verstrekken van een booleaanse waarde.
SELECT
pg_typeof(true),
pg_typeof(false);
Resultaat:
pg_typeof | pg_typeof -----------+----------- boolean | boolean
Retourtype van een functie
Nogmaals, het is onwaarschijnlijk dat u expliciet true
opgeeft of false
aan deze functie. Het is waarschijnlijker dat het van een variabele komt.
Maar je zou ook pg_typeof()
. kunnen gebruiken om het retourtype van een functie te achterhalen.
Hier is een voorbeeld.
SELECT pg_typeof(isfinite(date '2020-07-18'));
Resultaat:
boolean
In dit geval heb ik de isfinite()
. doorgegeven functie naar de pg_typeof()
functioneren als zijn argument.
En hier is nog een voorbeeld. In deze krijg ik het gegevenstype van de retourwaarde van de make_date()
functie.
SELECT pg_typeof(make_date('1999', '09', '19'));
Resultaat:
date
Gegevenstype van een kolom
Hier is een voorbeeld van het retourneren van het gegevenstype van een databasekolom.
SELECT pg_typeof(last_update)
FROM actor
LIMIT 1;
Resultaat:
timestamp without time zone
In dit geval heb ik het datatype van de actor.last_update
. gecontroleerd kolom in de pagila
voorbeelddatabase.
Laten we een andere kolom bekijken:
SELECT pg_typeof(name)
FROM language
LIMIT 1;
Resultaat:
character
Deze kolom wordt weergegeven als bpchar
in mijn interface, wat blijkbaar de interne typenaam is voor CHAR(n)
.
Trouwens, je kunt information_schema.columns
. opvragen voor het gegevenstype van een kolom.
Daarom zouden we in plaats daarvan de volgende query kunnen gebruiken:
SELECT
column_name,
data_type
FROM information_schema.columns
WHERE table_name = 'language';
Resultaat:
column_name | data_type -------------+----------------------------- language_id | integer name | character last_update | timestamp without time zone
In dit geval heb ik het gegevenstype voor alle kolommen in de tabel geretourneerd.