PostgreSQL: kèo chấp bóng đá | |||
---|---|---|---|
prev | UP | Chương 8. Kiểu dữ liệu | NEXT |
PostgreSQLCho phép các cột của bảng được xác định là kèo bóng đá pháp đa chiều dài thay đổi. Các kèo bóng đá pháp thuộc bất kỳ loại cơ sở, loại enum hoặc loại tổng hợp được định nghĩa hoặc người dùng có thể được tạo. kèo bóng đá pháp miền chưa được hỗ trợ.
Để minh họa việc sử dụng các loại kèo bóng đá pháp, chúng tôi tạo bảng này:
Tạo bảng SAL_EMP ( tên văn bản, pay_by_quarter số nguyên [], Lịch trình văn bản [] [] );
Như được hiển thị, một loại dữ liệu kèo bóng đá pháp được đặt tên bằng cách nối các dấu ngoặc vuông ([]) đến tên kiểu dữ liệu của các phần tử kèo bóng đá pháp. Lệnh trên sẽ tạo một bảng có tênSAL_EMPVới kèo bóng đá pháp cột loạiText(tên), một kèo bóng đá pháp một chiều của loạiSố nguyên(pay_by_quarter), đại diện cho tiền lương của nhân viên theo quý và một kèo bóng đá pháp hai chiềuText(Lịch trình), đại diện cho lịch trình hàng tuần của nhân viên.
Cú pháp choTạo bảngCho phép kích thước chính xác của kèo bóng đá pháp được chỉ định, ví dụ:
Tạo bảng Tictactoe ( Số nguyên bình phương [3] [3] );
Tuy nhiên, việc triển khai hiện tại bỏ qua mọi giới hạn kích thước kèo bóng đá pháp được cung cấp, tức là, hành vi này giống như đối với các kèo bóng đá pháp có độ dài không xác định.
Việc triển khai hiện tại cũng không thực thi số lượng kích thước được khai báo. Các kèo bóng đá pháp thuộc loại phần tử cụ thể đều được coi là cùng loại, bất kể kích thước hoặc số lượng kích thước. Vì vậy, khai báo kích thước kèo bóng đá pháp hoặc số lượng kích thước trongTạo bảngchỉ đơn giản là tài liệu; nó không ảnh hưởng đến hành vi thời gian chạy.
kèo bóng đá pháp cú pháp thay thế, phù hợp với tiêu chuẩn SQL bằng cách sử dụng từ khóakèo bóng đá pháp, có thể được sử dụng cho các kèo bóng đá pháp một chiều.pay_by_quarter12248_12278
kèo bóng đá pháp số nguyên pay_by_quarter [4],
Hoặc, nếu không có kích thước kèo bóng đá pháp nào được chỉ định:
pay_by_quarter kèo bóng đá pháp số nguyên,
Tuy nhiên, như trước đây,PostgreSQLkhông thực thi hạn chế kích thước trong mọi trường hợp.
Để viết một giá trị kèo bóng đá pháp dưới dạng hằng số theo nghĩa đen, đặt các giá trị phần tử trong niềng răng xoăn và tách chúng bằng dấu phẩy. . (Thông tin chi tiết xuất hiện bên dưới.) Vì vậy, định dạng chung của hằng số kèo bóng đá pháp là như sau:
'Val1 Delim Val2 Delim... '
WHEREDelimlà ký tự phân cách cho loại, như được ghi trong nópg_typemục nhập. Trong số các loại dữ liệu tiêu chuẩn được cung cấp trongPostgreSQLPhân phối, tất cả đều sử dụng dấu phẩy (,13602_13623Boxsử dụng dấu chấm phẩy (;). MỗiVallà hằng số của loại phần tử kèo bóng đá pháp hoặc subarray. Một ví dụ về hằng số kèo bóng đá pháp là:
'1,2,3, 4,5,6, 7,8,9'
Hằng số này là một kèo bóng đá pháp hai chiều, 3 x 3 bao gồm ba số con số của số nguyên.
Để đặt phần tử của hằng số kèo bóng đá pháp thành null, viếtnullcho giá trị phần tử. (Bất kỳ biến thể trường hợp nào trên hoặc dưới củanullSẽ làm.) Nếu bạn muốn kèo bóng đá pháp giá trị chuỗi thực tế"NULL", bạn phải đặt dấu ngoặc kép xung quanh nó.
(Các loại hằng số kèo bóng đá pháp này thực sự chỉ là một trường hợp đặc biệt của các hằng số loại chung được thảo luận trongPhần 4.1.2.7. Hằng số ban đầu được coi là một chuỗi và được chuyển đến thói quen chuyển đổi đầu vào kèo bóng đá pháp. Một đặc điểm kỹ thuật loại rõ ràng có thể cần thiết.)
Bây giờ chúng ta có thể hiển thị kèo bóng đá pháp sốChènCâu lệnh:
Chèn vào sal_emp Giá trị ('hóa đơn', '10000, 10000, 10000, 10000', '"Gặp gỡ", "Bữa trưa", "đào tạo", "thuyết trình"'); Chèn vào SAL_EMP Giá trị ('carol', '2000, 25000, 25000, 25000', '"Bữa sáng", "Tư vấn", "Gặp gỡ", "Bữa trưa"');
Kết quả của hai lần chèn trước trông như thế này:
Chọn * từ SAL_EMP; Tên | pay_by_quarter | lịch trình -------+-------------------------------+----------------------------------------------- Hóa đơn | 10000,10000,10000,10000 | họp, ăn trưa, đào tạo, trình bày Carol | 2000,25000,25000,25000 | Ăn sáng, tư vấn, cuộc họp, ăn trưa
kèo bóng đá pháp đa chiều phải có phạm vi phù hợp cho mỗi chiều. Một sự không phù hợp gây ra lỗi, ví dụ:
Chèn vào sal_emp Giá trị ('hóa đơn', '10000, 10000, 10000, 10000', '"cuộc họp", "Ăn trưa", "cuộc họp"'); Lỗi: kèo bóng đá pháp đa chiều phải có biểu thức kèo bóng đá pháp với kích thước phù hợp
Thekèo bóng đá phápCú pháp Constructor cũng có thể được sử dụng:
Chèn vào SAL_EMP Giá trị ('hóa đơn', kèo bóng đá pháp [10000, 10000, 10000, 10000], kèo bóng đá pháp [['cuộc họp', 'bữa trưa'], ['đào tạo', 'trình bày']])); Chèn vào SAL_EMP Giá trị ('carol', kèo bóng đá pháp [2000, 25000, 25000, 25000], kèo bóng đá pháp [['bữa sáng', 'tư vấn'], ['cuộc họp', 'ăn trưa']]);
Lưu ý rằng các phần tử kèo bóng đá pháp là hằng số hoặc biểu thức SQL thông thường; Chẳng hạn, các chuỗi chữ được trích dẫn đơn, thay vì được trích dẫn gấp đôi vì chúng sẽ ở trong một kèo bóng đá pháp theo nghĩa đen. Thekèo bóng đá pháp16441_16494Phần 4.2.12.
16708_16900
Chọn tên từ SAL_EMP trong đó pay_by_quarter [1] < pay_by_quarter [2]; tên ------- Carol (1 hàng)
Số đăng ký kèo bóng đá pháp được viết trong dấu ngoặc vuông. Theo mặc địnhPostgreSQLSử dụng quy ước đánh số một dựa trên cho các kèo bóng đá pháp, nghĩa là một kèo bóng đá phápnCác phần tử bắt đầu bằngkèo bóng đá pháp [1]và kết thúc bằngkèo bóng đá pháp [n].
Truy vấn này lấy tiền lương quý thứ ba của tất cả nhân viên:
Chọn pay_by_quarter [3] từ sal_emp; pay_by_quarter ---------------- 10000 25000 (2 hàng)
Chúng ta cũng có thể truy cập các lát hình chữ nhật tùy ý của một kèo bóng đá pháp hoặc subarrays. Một lát kèo bóng đá pháp được ký hiệu bằng cách viếtgiới hạn thấp hơn:giới hạn trêncho một hoặc nhiều kích thước kèo bóng đá pháp. Ví dụ: Truy vấn này lấy mục đầu tiên trong lịch trình của Bill trong hai ngày đầu tiên trong tuần:
Chọn Lịch trình [1: 2] [1: 1] từ SAL_EMP trong đó Tên = 'Bill'; lịch trình ------------------------ meet, đào tạo
Nếu bất kỳ kích thước nào được viết dưới dạng kèo bóng đá pháp lát cắt, tức là, chứa kèo bóng đá pháp dấu hai chấm, thì tất cả các chiều đều được coi là lát cắt. Bất kỳ kích thước nào chỉ có kèo bóng đá pháp số duy nhất (không có dấu hai chấm) được coi là từ 1 đến số được chỉ định. Ví dụ,[2]được coi là[1: 2], như trong ví dụ này:
Chọn Lịch trình [1: 2] [2] từ SAL_EMP trong đó Tên = 'Bill'; lịch trình ----------------------------------------------- họp, ăn trưa, đào tạo, trình bày
Để tránh sự nhầm lẫn với trường hợp không phải, tốt nhất là sử dụng cú pháp lát cắt cho tất cả các chiều, ví dụ:[1: 2] [1: 1], không[2] [1: 1].
18895_19136Lịch trìnhHiện tại có kích thước[1: 3] [1: 2]Sau đó tham khảoLịch trình [3] [3]mang lại NULL. Tương tự, một tham chiếu kèo bóng đá pháp với số lượng người đăng ký sai mang lại một null thay vì lỗi.
Một biểu thức lát kèo bóng đá pháp tương tự mang lại NULL nếu chính kèo bóng đá pháp hoặc bất kỳ biểu thức nào trong số các biểu thức phụ là null. Tuy nhiên, trong các trường hợp khác như chọn một lát kèo bóng đá pháp hoàn toàn bên ngoài giới hạn kèo bóng đá pháp hiện tại, một biểu thức lát cắt mang lại một kèo bóng đá pháp trống (không chiều) thay vì null. .
19942_20012Array_DIMS
chức năng:
chọn Array_Dims (Lịch trình) từ Sal_emp trong đó Tên = 'Carol'; Array_dims ------------ [1: 2] [1: 2] (1 hàng)
Array_DIMS
Sản xuất ATextKết quả, thuận tiện cho mọi người đọc nhưng có lẽ bất tiện cho các chương trình. Kích thước cũng có thể được truy xuất vớiArray_upper
vàArray_Lower
, trả về giới hạn trên và dưới của một kích thước kèo bóng đá pháp được chỉ định, tương ứng:
chọn Array_UPPER (Lịch trình, 1) từ Sal_emp trong đó Tên = 'Carol'; Array_UPPER ------------- 2 (1 hàng)
Array_length
Sẽ trả về chiều dài của một kích thước kèo bóng đá pháp được chỉ định:
chọn Array_Lpm (Lịch trình, 1) từ SAL_EMP trong đó Tên = 'Carol'; mảng_length -------------- 2 (1 hàng)
Cardinality
Trả về tổng số phần tử trong một kèo bóng đá pháp trên tất cả các kích thước. Nó thực sự là số lượng hàng gọi đếnUnnest
sẽ mang lại:
Chọn Cardinality (Lịch trình) từ SAL_EMP trong đó Tên = 'Carol'; cardinality ------------- 4 (1 hàng)
Một giá trị kèo bóng đá pháp có thể được thay thế hoàn toàn:
CẬP NHẬT SAL_EMP SET PAY_BY_QUARTER = '25000,25000,27000,27000' Tên where = 'carol';
21670_21685kèo bóng đá phápBiểu thức cú pháp:
Cập nhật SAL_EMP SET PAY_BY_QUARTER = kèo bóng đá pháp [25000,25000,27000,27000] Tên where = 'carol';
Một kèo bóng đá pháp cũng có thể được cập nhật tại một phần tử duy nhất:
CẬP NHẬT SAL_EMP SET PAY_BY_QUARTER [4] = 15000 Tên where = 'bill';
hoặc được cập nhật trong kèo bóng đá pháp lát:
Cập nhật SAL_EMP SET PAY_BY_QUARTER [1: 2] = '27000,27000' Tên where = 'carol';
Một giá trị kèo bóng đá pháp được lưu trữ có thể được mở rộng bằng cách gán cho các phần tử chưa có. Bất kỳ vị trí nào giữa các yếu tố hiện tại và các yếu tố mới được chỉ định sẽ được lấp đầy bằng null. Ví dụ: nếu kèo bóng đá phápMyArrayHiện tại có 4 yếu tố, nó sẽ có sáu yếu tố sau khi cập nhật gán choMyArray [6];MyArray [5]sẽ chứa null. Hiện tại, việc mở rộng theo kiểu này chỉ được phép cho các kèo bóng đá pháp một chiều, không phải kèo bóng đá pháp đa chiều.
Bài tập được đăng ký cho phép tạo các kèo bóng đá pháp không sử dụng các chỉ số một dựa trên. Ví dụ, người ta có thể gán choMyArray [-2: 7]22871_22928
Các giá trị kèo bóng đá pháp mới cũng có thể được xây dựng bằng toán tử nối,||:
Chọn kèo bóng đá pháp [1,2] || kèo bóng đá pháp [3,4]; ? Cột? ----------- 1,2,3,4
Toán tử nối cho phép một phần tử duy nhất được đẩy vào đầu hoặc kết thúc của một kèo bóng đá pháp một chiều. Nó cũng chấp nhận hain-Dimensional kèo bóng đá pháp hoặc mộtn-Dimensional và ann+1-Dimensional Array.
Khi một phần tử được đẩy vào đầu hoặc đầu của kèo bóng đá pháp một chiều, kết quả là một kèo bóng đá pháp có cùng một chỉ số giới hạn dưới với toán hạng kèo bóng đá pháp. Ví dụ:
chọn Array_DIMS (1 || '[0: 1] = 2,3' :: int []); Array_dims ------------ [0: 2] (1 hàng) Chọn mảng_dims (kèo bóng đá pháp [1,2] || 3); Array_dims ------------ [1: 3] (1 hàng)
23965_24263
chọn Array_DIMS (kèo bóng đá pháp [1,2] || kèo bóng đá pháp [3,4,5]); Array_dims ------------ [1: 5] (1 hàng) Chọn mảng_dims (kèo bóng đá pháp [[1,2], [3,4]] || kèo bóng đá pháp [[5,6], [7,8], [9,0]]); Array_dims ------------ [1: 5] [1: 2] (1 hàng)
Khi kèo bóng đá phápn-Dimensional kèo bóng đá pháp được đẩy vào đầu hoặc cuối củan+1-Dimensional kèo bóng đá pháp, kết quả tương tự như trường hợp kèo bóng đá pháp phần tử ở trên. Mỗin24755_24813n+1kích thước bên ngoài của Array -dimensional. Ví dụ:
chọn Array_DIMS (kèo bóng đá pháp [1,2] || kèo bóng đá pháp [[3,4], [5,6]]); Array_dims ------------ [1: 3] [1: 2] (1 hàng)
Một kèo bóng đá pháp cũng có thể được xây dựng bằng cách sử dụng các chức năngArray_Prepend
, Array_Append
hoặcmảng_cat
. Hai đầu tiên chỉ hỗ trợ các kèo bóng đá pháp một chiều, nhưngmảng_cat
Hỗ trợ các kèo bóng đá pháp đa chiều. Một số ví dụ:
chọn Array_Prepend (1, kèo bóng đá pháp [2,3]); Array_Prepend --------------- 1,2,3
Trong các trường hợp đơn giản, toán tử nối được thảo luận ở trên được ưu tiên sử dụng trực tiếp các chức năng này. Tuy nhiên, vì toán tử kết hợp bị quá tải để phục vụ cả ba trường hợp, nên có những tình huống sử dụng kèo bóng đá pháp trong các chức năng là hữu ích để tránh sự mơ hồ. Ví dụ, hãy xem xét:
Chọn Array [1, 2] || '3, 4'; - theo nghĩa đen chưa được coi là một kèo bóng đá pháp ? Cột? ----------- 1,2,3,4 Chọn kèo bóng đá pháp [1, 2] || '7'; - Đây là cái này Lỗi: kèo bóng đá pháp dị dạng theo nghĩa đen: "7" Chọn kèo bóng đá pháp [1, 2] || VÔ GIÁ TRỊ; - cũng vậy là một null không được trang trí ? Cột? ---------- 1,2
Trong các ví dụ trên, trình phân tích cú pháp nhìn thấy một kèo bóng đá pháp số nguyên ở một bên của toán tử nối và một loại không thể xác định ở bên kia. Heuristic mà nó sử dụng để giải quyết loại của hằng số là giả sử nó cùng loại với đầu vào khác của người vận hành - trong trường hợp này là kèo bóng đá pháp số nguyên. Vì vậy, toán tử nối được cho là đại diện chomảng_cat
, khôngArray_Append
. Khi đó là lựa chọn sai, nó có thể được sửa bằng cách đúc hằng số vào loại phần tử của kèo bóng đá pháp; Nhưng sử dụng rõ ràngArray_Append
có thể là kèo bóng đá pháp giải pháp thích hợp hơn.
Để tìm kiếm giá trị trong một kèo bóng đá pháp, mỗi giá trị phải được kiểm tra. Điều này có thể được thực hiện thủ công, nếu bạn biết kích thước của kèo bóng đá pháp. Ví dụ:
Chọn * từ SAL_EMP trong đó pay_by_quarter [1] = 10000 hoặc pay_by_quarter [2] = 10000 hoặc pay_by_quarter [3] = 10000 hoặc pay_by_quarter [4] = 10000;
Tuy nhiên, điều này nhanh chóng trở nên tẻ nhạt đối với các kèo bóng đá pháp lớn và không hữu ích nếu kích thước của kèo bóng đá pháp không rõ. Một phương pháp thay thế được mô tả trongPhần 9,23. Truy vấn trên có thể được thay thế bằng:
Chọn * từ SAL_EMP WHERE 10000 = Any (pay_by_quarter);
Ngoài ra, bạn có thể tìm thấy các hàng trong đó kèo bóng đá pháp có tất cả các giá trị bằng 10000 với:
Chọn * từ SAL_EMP WHERE 10000 = all (pay_by_quarter);
Ngoài ra,Generate_subscripts
28439_28476
Chọn * Từ (Chọn pay_by_quarter, Generate_subscripts (pay_by_quarter, 1) là s Từ sal_emp) như foo Trong đó pay_by_quarter [s] = 10000;
Hàm này được mô tả trongBảng 9-55.
Bạn cũng có thể tìm kiếm một kèo bóng đá pháp bằng&&toán tử, kiểm tra xem toán hạng bên trái có chồng chéo với toán hạng bên phải hay không. Ví dụ:
Chọn * từ SAL_EMP WHERE pay_by_quarter && kèo bóng đá pháp [10000];
Các toán tử kèo bóng đá pháp này và khác được mô tả thêm trongPostgreSQL:. Nó có thể được tăng tốc bởi kèo bóng đá pháp chỉ mục thích hợp, như được mô tả trongPhần 11.2.
Tip:29335_29615
Biểu diễn văn bản bên ngoài của giá trị kèo bóng đá pháp bao gồm các mục được giải thích theo các quy tắc chuyển đổi I/O cho loại phần tử của kèo bóng đá pháp, cộng với trang trí cho biết cấu trúc kèo bóng đá pháp. Trang trí bao gồm niềng răng xoăn (và) Xung quanh giá trị kèo bóng đá pháp cộng với các ký tự phân định giữa các mục liền kề. Ký tự phân định thường là dấu phẩy (,) Nhưng có thể là kèo bóng đá pháp cái gì đó khác: Nó được xác định bởitypdelimCài đặt cho loại phần tử của kèo bóng đá pháp. Trong số các loại dữ liệu tiêu chuẩn được cung cấp trongPostgreSQLPhân phối, tất cả đều sử dụng dấu phẩy, ngoại trừ loạiBox, sử dụng dấu chấm phẩy (;). Trong một kèo bóng đá pháp đa chiều, mỗi thứ nguyên (hàng, mặt phẳng, khối lập phương, v.v.) có mức độ niềng răng riêng của riêng mình và các dấu phân cách phải được viết giữa các thực thể giằng xoăn liền kề của cùng cấp độ.
30765_30970null30997_31271
Theo mặc định, giá trị chỉ mục giới hạn dưới của kích thước của một kèo bóng đá pháp được đặt thành một. Để biểu diễn các kèo bóng đá pháp có giới hạn dưới khác, các phạm vi đăng ký kèo bóng đá pháp có thể được chỉ định rõ ràng trước khi viết nội dung kèo bóng đá pháp. Trang trí này bao gồm các dấu ngoặc vuông ([]) Xung quanh mỗi giới hạn dưới và trên của kích thước kèo bóng đá pháp, với một dấu hai chấm (:) ký tự dấu phân cách ở giữa. Trang trí kích thước kèo bóng đá pháp được theo sau bởi một dấu bằng (=). Ví dụ:
Chọn F1 [1] [-2] [3] là E1, F1 [1] [-1] [5] Từ (chọn '[1: 1] [-2: -1] [3: 5] = 1,2,3, 4,5,6' :: int [] như f1) như ss; E1 | E2 ----+---- 1 | 6 (1 hàng)
Thói quen đầu ra kèo bóng đá pháp sẽ bao gồm các kích thước rõ ràng trong kết quả của nó chỉ khi có một hoặc nhiều giới hạn thấp hơn khác với một.
Nếu giá trị được viết cho kèo bóng đá pháp phần tử lànull(Trong mọi trường hợp biến thể), phần tử được coi là null. Sự hiện diện của bất kỳ trích dẫn hoặc dấu gạch chéo ngược nào vô hiệu hóa điều này và cho phép giá trị chuỗi theo nghĩa đen"NULL"sẽ được nhập. Ngoài ra, để tương thích ngược với phiên bản trước 8.2 củaPOSTGRESQL, Themảng_nullsTham số cấu hình có thể được bậtTẮT32652_32682nullnhư kèo bóng đá pháp null.
Như được hiển thị trước đó, khi viết một giá trị kèo bóng đá pháp, bạn có thể sử dụng dấu ngoặc kép xung quanh bất kỳ phần tử kèo bóng đá pháp riêng lẻ nào. BạnphảiLàm như vậy nếu giá trị phần tử sẽ nhầm lẫn trình phân tích cú pháp giá trị kèo bóng đá pháp. Ví dụ, các phần tử chứa niềng răng xoăn, dấu phẩy (hoặc ký tự phân định của loại dữ liệu), trích dẫn kép, dấu gạch chéo ngược hoặc khoảng trắng dẫn đầu hoặc dấu vết phải được trích dẫn kép. Chuỗi trống và chuỗi phù hợp với từnullcũng phải được trích dẫn. Để đặt một báo giá kép hoặc dấu gạch chéo ngược trong một giá trị phần tử kèo bóng đá pháp được trích dẫn, đi trước nó bằng một dấu gạch chéo ngược. Ngoài ra, bạn có thể tránh báo giá và sử dụng Backslash-ESCAPING để bảo vệ tất cả các ký tự dữ liệu nếu không sẽ được lấy làm cú pháp kèo bóng đá pháp.
Bạn có thể thêm khoảng trắng trước khi nẹp trái hoặc sau khi nẹp phải. Bạn cũng có thể thêm khoảng trắng trước hoặc sau bất kỳ chuỗi mục riêng lẻ nào. Trong tất cả các trường hợp này, khoảng trắng sẽ bị bỏ qua. Tuy nhiên, khoảng trắng trong các phần tử được trích dẫn kép hoặc được bao quanh ở cả hai bên bởi các ký tự không gian trắng của kèo bóng đá pháp phần tử, không bị bỏ qua.
Tip:Thekèo bóng đá phápCú pháp Constructor (xemPhần 4.2.12) thường dễ làm việc hơn so với cú pháp theo nghĩa chính của kèo bóng đá pháp khi viết các giá trị kèo bóng đá pháp trong các lệnh SQL. TRONGkèo bóng đá pháp, Các giá trị phần tử riêng lẻ được viết giống như cách chúng sẽ được viết khi không phải là thành viên của một kèo bóng đá pháp.