Làm thế nào để có kết quả 0 là mảng_length () khi không có phần tử


7

Tôi có một truy vấn như thế này:

select id, array_length(users_who_like_ids,1) as ct
from queryables
order by 2 desc;

Nhưng mảng trống (không có phần tử) sắp xếp trên đầu trang. Tôi muốn array_length()trả về 0 cho trường hợp đó để điều này được sắp xếp xuống cuối.

Tôi có thể không hiểu array_length()(ok, chắc chắn) nhưng:

embers_dev2=# select array_length(array[1,2], 1), array_length(ARRAY[]::integer[],1);

nhập mô tả hình ảnh ở đây

nên trả về 0 chứ không phải không có gì (NULL), phải không?

Tôi có thể làm một câu lệnh if như nội tuyến trên nó không?

Biên tập

Theo câu trả lời liên quan này trên SO, có vẻ như đó COALESCEcó thể là điều tôi muốn - nhưng tôi cởi mở với những ý tưởng tốt hơn:


Câu hỏi liên quan trước: dba.stackexchange.com/q/122187/3684
Erwin Brandstetter

Câu trả lời:


8

nên trả về 0 chứ không phải không có gì (NULL), phải không?

Đó là tranh luận về những gì sẽ trở lại. Nhưng cách Postgres định nghĩa nó, kết quả cho bất kỳ thứ nguyên nào không tồn tại là NULL.

COALESCE là công cụ để sửa truy vấn của bạn, nhưng giải pháp tốt hơn là không phá vỡ nó để bắt đầu.

Thay thế trong Postgres 9,4

Postgres 9.4 trở lên cung cấp một chức năng riêng cardinality()cho mỗi tài liệu:

trả về tổng số phần tử trong mảng hoặc 0 nếu mảng trống

Nhấn mạnh đậm của tôi.
Có vẻ như bạn xử lý các mảng 1 chiều độc quyền và chỉ muốn sử dụng đó .

test=# SELECT cardinality('{}'::int[]);
 cardinality
-------------
           0

Tuy nhiên, đây chưa phải là cách khắc phục thích hợp cho vấn đề của bạn. Toàn bộ mảng có thể là NULL, trả về NULL theo cách nào đó và vẫn sắp xếp trên đầu trang.

Sửa truy vấn với NULLS LAST

SELECT id, array_length(users_who_like_ids, 1) AS ct
FROM   queryables
ORDER  BY 2 DESC NULLS LAST;

Điều này luôn luôn xử lý các giá trị NULL đúng cách. Bạn vẫn có thể muốn sử dụng cardinality()để sắp xếp các mảng trống trước NULL. Nhưng hãy lưu ý về sự khác biệt khi xử lý các mảng đa chiều.


Tôi đã cập nhật câu trả lời của mình cho câu hỏi trước đó của bạn cho phù hợp: dba.stackexchange.com/a/122511/3684 . Lưu ý rằng truy vấn đầu tiên ở đó tránh được một vấn đề tương tự vì hàm tổng hợp count()không bao giờ trả về NULL.
Erwin Brandstetter

thx Erwin cho câu trả lời xuất sắc (một lần nữa) - chắc chắn sẽ đi với NULLS LAST và hy vọng sẽ sớm thực hiện các mảng đa chiều và JSON; thực sự thích Postgres
timpone
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.