Cách tạo chỉ mục trên biểu thức CASE trong Postgres


8

Tôi đang cố gắng tạo một chỉ mục trên biểu thức CASE, như sau

CREATE TABLE test(i INT, j INT);

CREATE UNIQUE INDEX test_index ON test(CASE WHEN i=1 THEN j END);

Nhận lỗi này:

ERROR:  syntax error at or near "CASE"
LINE 1: CREATE UNIQUE INDEX test_index ON test(CASE WHEN i=1 THEN j ...
                                               ^

********** Error **********

ERROR: syntax error at or near "CASE"
SQL state: 42601
Character: 40

Tôi đang làm gì sai?

Hậu duệ 9.5.2

Câu trả lời:


17

Bạn cần thêm dấu ngoặc đơn xung quanh CASEbiểu thức:

CREATE UNIQUE INDEX test_index 
  ON test ((CASE WHEN i=1 THEN j END)) ;

Như các tài liệu nêu trong CREATE INDEX:

(Các) trường khóa cho chỉ mục được chỉ định làm tên cột hoặc cách khác là biểu thức được viết trong ngoặc đơn .


Cũng xem xét sử dụng một chỉ mục được lọc, tương đương về chức năng nhưng sẽ sử dụng ít không gian hơn, vì nó sẽ chỉ lưu trữ các jgiá trị cho các hàng có i = 1và không phải (có thể là hàng triệu) hoặc các NULLgiá trị còn lại :

CREATE UNIQUE INDEX test_index_2 
  ON test (j) WHERE i=1 ;

Tôi muốn thêm +1 cho đề xuất chỉ mục được lọc.
Colin 't Hart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.