I PostgreSQL er pg_typeof()
funktionen giver dig mulighed for at få datatypen for enhver værdi.
Mere specifikt returnerer den OID'en for datatypen for den værdi, der sendes til den. Det returnerer en regtype
, som er en OID-aliastype. Derfor er det det samme som et OID til sammenligningsformål, men vises som et typenavn.
Syntaks
Funktionen har følgende syntaks:
pg_typeof(any)
Hvor any
er enhver værdi.
Eksempel
Her er et grundlæggende eksempel at demonstrere.
SELECT pg_typeof(100);
Resultat:
heltal
Vilkårlige strenge
I Postgres er der mere end én type streng (f.eks. char
, varchar
, text
). Derfor kan du ikke bare omgive et argument i enkelte anførselstegn og forvente, at det ved, hvad dets datatype er.
SELECT pg_typeof('Elephant');
Resultat:
ukendt
Derfor bliver du nødt til at angive dens faktiske datatype.
SELECT pg_typeof('Elephant'::varchar);
Resultat:
tegn varierende
I Postgres, character varying
er navnet på varchar
(faktisk varchar
er alias for character varying
).
Dette sidste eksempel var lidt overflødigt, da jeg eksplicit angav variabeltypen, hvilket betød, at jeg allerede vidste, hvad resultatet ville blive.
I den virkelige verden er det mere sandsynligt, at du vil forsøge at få datatypen for en variabel.
Returtype for en variabel
I dette eksempel sætter jeg den forrige streng ind i en variabel og får derefter dens datatype.
DO $$
DECLARE myString varchar(10) := 'Elephant';
BEGIN
raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$
Resultat:
BEMÆRKNING:Værdi:ElephantType:karakter varierende
Her er den igen, bortset fra at jeg ændrer datatypen til en anden strengtype (char(8)
).
DO $$
DECLARE myString char(8) := 'Elephant';
BEGIN
raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$
Resultat:
BEMÆRKNING:Værdi:ElephantType:tegn
Boolske værdier
Her er et eksempel på eksplicit at angive en boolesk værdi.
SELECT
pg_typeof(true),
pg_typeof(false);
Resultat:
pg_typeof | pg_typeof-----------+----------- boolean | boolesk
Returtype for en funktion
Igen, det er usandsynligt, at du eksplicit vil angive true
eller false
til denne funktion. Det er mere sandsynligt, at det kommer fra en variabel.
Men du kan også bruge pg_typeof()
for at finde ud af en funktions returtype.
Her er et eksempel.
SELECT pg_typeof(isfinite(date '2020-07-18'));
Resultat:
boolesk
I dette tilfælde bestod jeg isfinite()
funktion til pg_typeof()
fungere som dets argument.
Og her er endnu et eksempel. I denne får jeg datatypen for returværdien af make_date()
funktion.
SELECT pg_typeof(make_date('1999', '09', '19'));
Resultat:
dato
Datatype for en kolonne
Her er et eksempel på returnering af datatypen for en databasekolonne.
SELECT pg_typeof(last_update)
FROM actor
LIMIT 1;
Resultat:
tidsstempel uden tidszone
I dette tilfælde tjekkede jeg datatypen for actor.last_update
kolonne i pagila
eksempeldatabase.
Lad os tjekke en anden kolonne:
SELECT pg_typeof(name)
FROM language
LIMIT 1;
Resultat:
tegn
Denne kolonne vises som bpchar
i min grænseflade, som tilsyneladende er det interne typenavn for CHAR(n)
.
Forresten kan du forespørge information_schema.columns
for datatypen for en kolonne.
Derfor kunne vi bruge følgende forespørgsel i stedet:
SELECT
column_name,
data_type
FROM information_schema.columns
WHERE table_name = 'language';
Resultat:
kolonnenavn | data_type -------------+------------------------------------ sprog_id | heltal navn | tegn sidste_opdatering | tidsstempel uden tidszone
I dette tilfælde returnerede jeg datatypen for alle kolonner i tabellen.