มีวิธีใดในการค้นหาขนาดของอาร์เรย์หรือไม่?
ตัวอย่างเช่น,
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