Làm thế nào tôi có thể nhận được vị trí của một giá trị trong mảng PostgreSQL? Có phương thức .index()
cho hàm Python và array_search()
cho PHP, nhưng tôi không thể tìm thấy bất kỳ chức năng nào như vậy cho PostgreSQL. Tôi có nên viết một hàm được lưu trữ để làm điều đó không? Tôi thích giải quyết bằng cách sử dụng chức năng tích hợp sẵn.Tìm vị trí của một giá trị trong mảng PostgreSQL
Trả lời
Since version 9.5, có sẵn chức năng: array_position()
và array_positions()
, để tìm kiếm khóa mảng (chỉ lần xuất hiện đầu tiên) hoặc phím (tất cả lần xuất hiện), theo giá trị.
Các chức năng này hỗ trợ loại anyarray.
documentation recommends sử dụng chức năng generate_subscripts
. Hàm bên dưới của mô phỏng dưới đây là array_search
:
CREATE FUNCTION array_search(needle ANYELEMENT, haystack ANYARRAY)
RETURNS INT AS $$
SELECT i
FROM generate_subscripts($2, 1) AS i
WHERE $2[i] = $1
ORDER BY i
$$ LANGUAGE sql STABLE;
Điều này trả về chỉ mục của kết quả đầu tiên, nếu có. Nếu bạn muốn tất cả các kết quả phù hợp, chỉ cần thay đổi RETURNS INT
thành RETURNS SETOF INT
. Hàm này, như là, trả về NULL
nếu không tìm thấy kết quả phù hợp.
Chức năng này chỉ hoạt động với mảng một chiều.
Ngoài ra, hãy nhớ rằng luôn luôn array_search(NULL, a)
trả NULL
, ngay cả khi mảng chứa các yếu tố null:
> SELECT array_search(null, array[1, 2, null, 4]);
array_search
--------------
(1 row)
Điều này là do SQL coi NULL = NULL
là biết (ví dụ: NULL
). Xem functions-comparison. Nếu bạn muốn array_search
để có thể tìm NULL
yếu tố, thay đổi
WHERE $2[i] = $1
để
WHERE $2[i] IS NOT DISTINCT FROM $1
Đối với mảng số nguyên chỉ bạn có thể sử dụng rất nhanh idx
function from the intarray
bundled extension.
Chức năng này chưa được tổng quát hóa để hỗ trợ tất cả các loại mảng, do đó, bạn bị kẹt với phương pháp SQL rất chậm đối với các mảng khác.
- 1. Tìm giá trị băm của một hàng trong postgresql
- 2. Vị trí bộ nhớ của giá trị enum trong C
- 3. GridView.setItemChecked (vị trí, giá trị)
- 4. Chọn vị trí không bằng nhiều giá trị của các khóa của mảng kết hợp
- 5. Tìm vị trí/Vị trí của JFrame trong cửa sổ
- 6. Query trên giá trị của các phần tử mảng (PostgreSQL)
- 7. Cách lấy vị trí của một khóa trong một mảng
- 8. Cách tìm kích thước của một mảng trong postgresql
- 9. Tìm vị trí của một phần tử trong một mảng đơn giản
- 10. Tìm giá trị trung bình của một mảng?
- 11. tìm vị trí của một chuỗi con trong một chuỗi
- 12. Tìm chỉ mục của một danh sách giá trị trong một mảng có nhiều mảng
- 13. Qt: ý nghĩa của giá trị trả lại vị trí?
- 14. Postgresql: chèn giá trị của một cột từ một tệp
- 15. Yếu tố vị trí trong mảng
- 16. Tìm một chuỗi trong một cột mảng trong PostgreSQL
- 17. Tìm hiểu vị trí của các vị trí khác nhau
- 18. Tìm vị trí của '1 hiệu quả trong một mảng bit
- 19. Tìm giá trị trung bình của mảng chưa phân loại
- 20. Tìm vị trí của một phần tử trong danh sách
- 21. Tìm vị trí của dấu mũ trong một TextBox
- 22. tìm giá trị nhỏ nhất trong một mảng float
- 23. Tìm n giá trị nhỏ nhất trong một mảng
- 24. Tìm nhiều giá trị trong một mảng Numpy
- 25. tìm vị trí tweet
- 26. Java: Tìm giá trị cao nhất trong một mảng
- 27. Tìm giá trị bất thường trong một mảng, liệt kê
- 28. Nhận giá trị của một vị trí của S4 đối tượng?
- 29. Giá trị mặc định của thuộc tính "vị trí" của một DIV là gì?
- 30. PostgreSQL - đặt một giá trị cell mặc định theo một giá trị của ô
+1 cho generate_subscripts() và câu trả lời rất hoàn chỉnh. –
Câu trả lời hay. Điều này sẽ đơn giản và hiệu quả hơn khi PostgreSQL 9.4 thêm các hàm 'WITH ORDINAL', cho phép bạn chỉ cần viết' unnest (the_array) WITH ORDINAL'. Có lẽ tôi nên viết và gửi một hàm 'idx' đúng cho 9.4, mặc dù ... –