В PostgreSQL, pg_typeof()
функцията ви позволява да получите типа данни на произволна стойност.
По-конкретно, той връща OID на типа данни на стойността, която му се предава. Връща regtype
, което е тип псевдоним на OID. Следователно той е същият като OID за целите на сравнението, но се показва като име на тип.
Синтаксис
Функцията има следния синтаксис:
pg_typeof(any)
Където any
е всякаква стойност.
Пример
Ето основен пример за демонстрация.
SELECT pg_typeof(100);
Резултат:
integer
Произволни низове
В Postgres има повече от един тип низ (напр. char
, varchar
, text
). Следователно не можете просто да заобиколите аргумент в единични кавички и да очаквате той да знае какъв е неговият тип данни.
SELECT pg_typeof('Elephant');
Резултат:
unknown
Следователно ще трябва да посочите неговия действителен тип данни.
SELECT pg_typeof('Elephant'::varchar);
Резултат:
character varying
В Postgres, character varying
е името за varchar
(всъщност, varchar
е псевдонимът за character varying
).
Този последен пример беше малко излишен, тъй като изрично посочих типа на променливата, което означаваше, че вече знаех какъв ще бъде резултатът.
В реалния свят е по-вероятно да се опитвате да получите типа данни на променлива.
Тип връщане на променлива
В този пример поставям предишния низ в променлива, след което получавам неговия тип данни.
DO $$
DECLARE myString varchar(10) := 'Elephant';
BEGIN
raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$
Резултат:
NOTICE: Value: Elephant Type: character varying
Ето го отново, с изключение на това, че променям типа данни на различен тип низ (char(8)
).
DO $$
DECLARE myString char(8) := 'Elephant';
BEGIN
raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$
Резултат:
NOTICE: Value: Elephant Type: character
Булеви стойности
Ето пример за изрично предоставяне на булева стойност.
SELECT
pg_typeof(true),
pg_typeof(false);
Резултат:
pg_typeof | pg_typeof -----------+----------- boolean | boolean
Тип връщане на функция
Отново е малко вероятно да предоставите изрично true
или false
към тази функция. По-вероятно е той да идва от променлива.
Но можете да използвате и pg_typeof()
за да разберете типа връщане на функция.
Ето един пример.
SELECT pg_typeof(isfinite(date '2020-07-18'));
Резултат:
boolean
В този случай предадох isfinite()
функция към pg_typeof()
функция като негов аргумент.
И ето още един пример. В този получавам типа данни на връщаната стойност на make_date()
функция.
SELECT pg_typeof(make_date('1999', '09', '19'));
Резултат:
date
Тип данни на колона
Ето пример за връщане на типа данни на колона от база данни.
SELECT pg_typeof(last_update)
FROM actor
LIMIT 1;
Резултат:
timestamp without time zone
В този случай проверих типа данни на actor.last_update
колона в pagila
примерна база данни.
Нека проверим друга колона:
SELECT pg_typeof(name)
FROM language
LIMIT 1;
Резултат:
character
Тази колона се показва като bpchar
в моя интерфейс, което очевидно е вътрешното име на тип за CHAR(n)
.
Между другото, можете да направите заявка за information_schema.columns
за типа данни на колона.
Следователно вместо това бихме могли да използваме следната заявка:
SELECT
column_name,
data_type
FROM information_schema.columns
WHERE table_name = 'language';
Резултат:
column_name | data_type -------------+----------------------------- language_id | integer name | character last_update | timestamp without time zone
В този случай върнах типа данни за всички колони в таблицата.