2017-09-05 18 views
5

Tôi tìm thấy một biểu thức trong một email postgres.org, có vẻ hữu ích, nhưng có tài liệu tôi không thể tìm thấy.Tài liệu postlres sql 'cast a tuple' được viết thành tài liệu ở đâu?

select t.*::text from t 

Ở đây, ::text diễn viên dường như áp dụng cho mỗi cột, và kết quả đầu ra như hiển thị bởi psql là một chút kỳ quặc. Có lẽ ai đó có thể giáo dục những kẻ như tôi và làm sáng tỏ bí ẩn đó.

Edit: Tò mò, phần 4.2.9. Type Casts làm cho không có tham chiếu đến cú pháp này

Edit: Cuối cùng! Tài liệu liên quan được tìm thấy tại 4.2.13. Row Constructors

Trả lời

4

Tôi có thể mô tả những gì đang xảy ra. Xem xét cú pháp này:

select (1, 2) 

Điều này trả về một bản ghi (hoặc tuple) với hai cột. Bạn có thể chuyển đổi các tuple văn bản bằng cách sử dụng cast() hoặc :::

select (1, 2)::text 

Điều tương tự cũng xảy ra với t.*. Nó được hiểu là:

select (t.*)::text 

Bạn sẽ nhận được kết quả tương tự với:

select cast(t.* as text) 
+0

Cảm ơn phản hồi của bạn rất rõ ràng.Thú vị để tìm ra rằng sql cho phép các biểu thức 'tuple': "(a, b.c)". Postgres thực sự có tài liệu tuyệt vời về chủ đề này, tại: 8.16.5. Sử dụng các loại tổng hợp trong truy vấn – artejera

2

Chỉ cần sử dụng tên (hoặc bí danh) của bảng t trực tiếp:

SELECT t::text FROM t 

t.* sẽ được sử dụng để phân tách hàng, nhưng kể từ khi bạn đưa toàn bộ hàng vào văn bản, bước này là nhiễu thừa.

cast là có thể vì mọi thứ có thể được truyền tới text trong Postgres. (Phải có một văn bản đại diện cho đầu vào/đầu ra.)

Bạn sẽ có được một đại diện văn bản của hàng theo một trong hai cách. I E. đầu ra là chuỗi giá trị theo nghĩa đen, mà bạn có thể đúc lại với loại hàng đăng ký, như:

SELECT '(123,"some text",,"2017-01-03 02:27:27.930164+01")'::t 

t là tên của một bảng hoặc (cụ thể hóa) view (có thể nhìn thấy trong hiện tại search_path hoặc bạn phải giản đồ đủ điều kiện) hoặc bất kỳ loại đăng ký (hàng) nào khác.

Điều này làm việc với tên bảng trong hộp vì Postgres đăng ký loại hàng cho mỗi bảng bạn tạo.

Lưu ý, không phải ký hiệu t.* cũng như không thể truyền lại cho các bản ghi ẩn danh (như ROW(1,2) hoặc chỉ ngắn (1,2)). Không có thông tin về cấu trúc của chúng trong danh mục hệ thống.

liên quan:

Các vấn đề liên quan