I PostgreSQL, pg_typeof()
funktionen låter dig få datatypen för vilket värde som helst.
Mer specifikt returnerar den OID för datatypen för värdet som skickas till den. Den returnerar en regtype
, som är en OID-aliastyp. Därför är det samma som ett OID för jämförelseändamål men visas som ett typnamn.
Syntax
Funktionen har följande syntax:
pg_typeof(any)
Där any
är vilket värde som helst.
Exempel
Här är ett grundläggande exempel att visa.
SELECT pg_typeof(100);
Resultat:
integer
Godyckliga strängar
I Postgres finns det mer än en typ av sträng (t.ex. char
, varchar
, text
). Därför kan du inte bara omge ett argument med enstaka citattecken och förvänta dig att det ska veta vad dess datatyp är.
SELECT pg_typeof('Elephant');
Resultat:
unknown
Därför måste du ange dess faktiska datatyp.
SELECT pg_typeof('Elephant'::varchar);
Resultat:
character varying
I Postgres, character varying
är namnet för varchar
(faktiskt varchar
är aliaset för character varying
).
Det sista exemplet var lite överflödigt, eftersom jag uttryckligen angav variabeltypen, vilket gjorde att jag redan visste vad resultatet skulle bli.
I den verkliga världen är det mer troligt att du kommer att försöka få datatypen för en variabel.
Returtyp för en variabel
I det här exemplet lägger jag den föregående strängen i en variabel och hämtar sedan dess datatyp.
DO $$
DECLARE myString varchar(10) := 'Elephant';
BEGIN
raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$
Resultat:
NOTICE: Value: Elephant Type: character varying
Här är den igen, förutom att jag ändrar datatypen till en annan strängtyp (char(8)
).
DO $$
DECLARE myString char(8) := 'Elephant';
BEGIN
raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$
Resultat:
NOTICE: Value: Elephant Type: character
Booleska värden
Här är ett exempel på att explicit tillhandahålla ett booleskt värde.
SELECT
pg_typeof(true),
pg_typeof(false);
Resultat:
pg_typeof | pg_typeof -----------+----------- boolean | boolean
Returtyp för en funktion
Återigen, det är osannolikt att du uttryckligen anger true
eller false
till denna funktion. Det är mer troligt att det kommer från en variabel.
Men du kan också använda pg_typeof()
för att ta reda på returtypen för en funktion.
Här är ett exempel.
SELECT pg_typeof(isfinite(date '2020-07-18'));
Resultat:
boolean
I det här fallet passerade jag isfinite()
funktion till pg_typeof()
fungera som dess argument.
Och här är ett annat exempel. I den här får jag datatypen för returvärdet för make_date()
funktion.
SELECT pg_typeof(make_date('1999', '09', '19'));
Resultat:
date
Datatyp för en kolumn
Här är ett exempel på att returnera datatypen för en databaskolumn.
SELECT pg_typeof(last_update)
FROM actor
LIMIT 1;
Resultat:
timestamp without time zone
I det här fallet kontrollerade jag datatypen för actor.last_update
kolumnen i pagila
exempeldatabas.
Låt oss kolla en annan kolumn:
SELECT pg_typeof(name)
FROM language
LIMIT 1;
Resultat:
character
Den här kolumnen visas som bpchar
i mitt gränssnitt, vilket tydligen är det interna typnamnet för CHAR(n)
.
Förresten, du kan fråga information_schema.columns
för datatypen för en kolumn.
Därför kan vi använda följande fråga istället:
SELECT
column_name,
data_type
FROM information_schema.columns
WHERE table_name = 'language';
Resultat:
column_name | data_type -------------+----------------------------- language_id | integer name | character last_update | timestamp without time zone
I det här fallet returnerade jag datatypen för alla kolumner i tabellen.