มีวิธีใดในการค้นหาขนาดของอาร์เรย์หรือไม่?
ตัวอย่างเช่น,
CREATE TABLE example (id integer[]) ;
INSERT INTO exam VALUES ( '{}');
INSERT INTO exam VALUES ( '{5,6,7}');
จากนี้มีความเป็นไปได้หรือไม่ที่จะได้ผลลัพธ์ดังต่อไปนี้
size
0
3
มีวิธีใดในการค้นหาขนาดของอาร์เรย์หรือไม่?
ตัวอย่างเช่น,
CREATE TABLE example (id integer[]) ;
INSERT INTO exam VALUES ( '{}');
INSERT INTO exam VALUES ( '{5,6,7}');
จากนี้มีความเป็นไปได้หรือไม่ที่จะได้ผลลัพธ์ดังต่อไปนี้
size
0
3
คำตอบ:
ดังที่ vyegorov กล่าวถึงarray_length
จะทำเคล็ดลับ หรือถ้าคุณรู้ว่าอาร์เรย์เป็น 1 มิติ (ซึ่งน่าจะเป็น) และกำลังเรียกใช้ PostgreSQL 9.4 ขึ้นไปคุณสามารถใช้cardinality
:
SELECT cardinality(id) FROM example;
cardinality
ส่งคืนจำนวนขององค์ประกอบทั้งหมดในอาร์เรย์เดียวหรือหลายมิติ ดังนั้นselect cardinality(ARRAY[[1,2], [3,4]]);
จะกลับมา4
ในขณะที่จะกลับมาselect array_length(ARRAY[[1,2], [3,4]], 1)
2
หากคุณกำลังนับมิติแรกarray_length
เป็นการเดิมพันที่ปลอดภัยกว่า
text
ประเภทในขณะที่function array_length(text[]) does not exist
;)
null
และไม่ได้0
ในขณะที่cardinality
ผลตอบแทนสิ่งที่คุณคาดหวัง ไม่รู้ว่าพวกเขากำลังคิดอะไรกับตรรกะนั้น
มันเป็นเอกสารการอ่านเล็กน้อย:
SELECT array_length(id, 1) FROM example;
array_length
คืออะไร ไม่พบข้อมูลนั้นในเอกสาร
null
และ3
แทนที่จะเป็น0
และ3
สำหรับตัวอย่าง OPs ควรส่งเสริมการใช้cardinality
เมื่อยอมรับคำตอบอย่างแน่นอนเนื่องจากใช้งานได้ง่ายขึ้นและคาดไม่ถึง (ฉันคิดว่าการใช้อาร์เรย์ 99.999% เป็นมิติเดียว)
สมมติว่าขนาดของอาร์เรย์จะเป็น 1 เสมอไม่ใช่สิ่งที่ฉันรู้สึกสบายใจฉันจึงเลือกสิ่งต่อไปนี้:
SELECT coalesce(array_length(id, 1), 0) as size FROM example;
เป็นเวลาอย่างน้อยหนึ่งทศวรรษ แต่เราเคยทำอะไรมามากมายcoalesce
และมันก็มีประโยชน์มาก บางทีฉันอาจจะเอื้อมมือไปเพื่อความสะดวกสบาย
ต้องใช้ array_upper ใน postgres 8.2