Trong PostgreSQL, pg_typeof()
cho phép bạn nhận được kiểu dữ liệu của bất kỳ giá trị nào.
Cụ thể hơn, nó trả về OID của kiểu dữ liệu của giá trị được chuyển cho nó. Nó trả về một regtype
, là một loại bí danh OID. Do đó, nó giống như OID cho mục đích so sánh nhưng hiển thị dưới dạng tên loại.
Cú pháp
Hàm có cú pháp sau:
pg_typeof(any)
Ở đâu any
là bất kỳ giá trị nào.
Ví dụ
Đây là một ví dụ cơ bản để chứng minh.
SELECT pg_typeof(100);
Kết quả:
integer
Chuỗi tùy ý
Trong Postgres, có nhiều loại chuỗi (ví dụ:char
, varchar
, text
). Do đó, bạn không thể chỉ đặt một đối số trong các dấu ngoặc kép và mong đợi đối số biết kiểu dữ liệu của nó là gì.
SELECT pg_typeof('Elephant');
Kết quả:
unknown
Do đó, bạn sẽ cần chỉ định loại dữ liệu thực tế của nó.
SELECT pg_typeof('Elephant'::varchar);
Kết quả:
character varying
Trong Postgres, ký tự character varying
là tên của varchar
(thực ra, varchar
là bí danh cho ký tự character varying
).
Ví dụ cuối cùng này hơi thừa, vì tôi đã nêu rõ loại biến, có nghĩa là tôi đã biết kết quả sẽ như thế nào.
Trong thế giới thực, có nhiều khả năng bạn đang cố lấy loại dữ liệu của một biến.
Loại trả về của một biến
Trong ví dụ này, tôi đặt chuỗi trước đó vào một biến, sau đó lấy kiểu dữ liệu của nó.
DO $$
DECLARE myString varchar(10) := 'Elephant';
BEGIN
raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$
Kết quả:
NOTICE: Value: Elephant Type: character varying
Đây là một lần nữa, ngoại trừ việc tôi thay đổi kiểu dữ liệu thành một kiểu chuỗi khác (char(8)
).
DO $$
DECLARE myString char(8) := 'Elephant';
BEGIN
raise notice 'Value: % % Type: %', myString, E'\n', pg_typeof(myString);
END $$
Kết quả:
NOTICE: Value: Elephant Type: character
Giá trị Boolean
Dưới đây là một ví dụ về việc cung cấp giá trị boolean một cách rõ ràng.
SELECT
pg_typeof(true),
pg_typeof(false);
Kết quả:
pg_typeof | pg_typeof -----------+----------- boolean | boolean
Kiểu trả về của một hàm
Một lần nữa, không chắc bạn sẽ cung cấp true
một cách rõ ràng hoặc false
đến chức năng này. Nhiều khả năng nó sẽ đến từ một biến.
Nhưng bạn cũng có thể sử dụng pg_typeof()
để tìm ra kiểu trả về của một hàm.
Đây là một ví dụ.
SELECT pg_typeof(isfinite(date '2020-07-18'));
Kết quả:
boolean
Trong trường hợp này, tôi đã vượt qua isfinite()
hàm cho pg_typeof()
hoạt động như đối số của nó.
Và đây là một ví dụ khác. Trong cái này, tôi nhận được kiểu dữ liệu của giá trị trả về của make_date()
chức năng.
SELECT pg_typeof(make_date('1999', '09', '19'));
Kết quả:
date
Kiểu dữ liệu của cột
Dưới đây là một ví dụ về việc trả về kiểu dữ liệu của một cột cơ sở dữ liệu.
SELECT pg_typeof(last_update)
FROM actor
LIMIT 1;
Kết quả:
timestamp without time zone
Trong trường hợp này, tôi đã kiểm tra kiểu dữ liệu của actor.last_update
trong pagila
cơ sở dữ liệu mẫu.
Hãy kiểm tra một cột khác:
SELECT pg_typeof(name)
FROM language
LIMIT 1;
Kết quả:
character
Cột này hiển thị dưới dạng bpchar
trong giao diện của tôi, đây rõ ràng là tên loại nội bộ cho CHAR(n)
.
Nhân tiện, bạn có thể truy vấn information_schema.columns
cho kiểu dữ liệu của một cột.
Do đó, chúng tôi có thể sử dụng truy vấn sau để thay thế:
SELECT
column_name,
data_type
FROM information_schema.columns
WHERE table_name = 'language';
Kết quả:
column_name | data_type -------------+----------------------------- language_id | integer name | character last_update | timestamp without time zone
Trong trường hợp này, tôi đã trả lại kiểu dữ liệu cho tất cả các cột trong bảng.