วิธีค้นหาขนาดของอาร์เรย์ใน postgresql


98

มีวิธีใดในการค้นหาขนาดของอาร์เรย์หรือไม่?

ตัวอย่างเช่น,

CREATE TABLE example (id integer[]) ;

INSERT INTO exam VALUES ( '{}');

INSERT INTO exam VALUES ( '{5,6,7}');

จากนี้มีความเป็นไปได้หรือไม่ที่จะได้ผลลัพธ์ดังต่อไปนี้

size

0

3

คำตอบ:


120

ดังที่ vyegorov กล่าวถึงarray_lengthจะทำเคล็ดลับ หรือถ้าคุณรู้ว่าอาร์เรย์เป็น 1 มิติ (ซึ่งน่าจะเป็น) และกำลังเรียกใช้ PostgreSQL 9.4 ขึ้นไปคุณสามารถใช้cardinality:

SELECT cardinality(id) FROM example;

10
หากใครสามารถพูดถึงความแตกต่างที่สำคัญในการใช้ array_length และ cardinality ที่จะดีมาก
Zia Ul Rehman Mughal

6
cardinalityส่งคืนจำนวนขององค์ประกอบทั้งหมดในอาร์เรย์เดียวหรือหลายมิติ ดังนั้นselect cardinality(ARRAY[[1,2], [3,4]]);จะกลับมา4ในขณะที่จะกลับมาselect array_length(ARRAY[[1,2], [3,4]], 1) 2หากคุณกำลังนับมิติแรกarray_lengthเป็นการเดิมพันที่ปลอดภัยกว่า
Roshambo

2
สิ่งนี้ใช้ได้กับอาร์เรย์ที่บันทึกในฟิลด์ที่มีtextประเภทในขณะที่function array_length(text[]) does not exist;)
santuxus

1
@ZiaUlRehmanMughal ยังยาวอาร์เรย์ของอาร์เรย์ที่ว่างเปล่าโดยไม่คาดคิดที่จะประเมินnullและไม่ได้0ในขณะที่cardinalityผลตอบแทนสิ่งที่คุณคาดหวัง ไม่รู้ว่าพวกเขากำลังคิดอะไรกับตรรกะนั้น
EoghanM

82

มันเป็นเอกสารการอ่านเล็กน้อย:

SELECT array_length(id, 1) FROM example;

13
คุณรู้หรือไม่ว่าพารามิเตอร์ที่สองของฟังก์ชันarray_lengthคืออะไร ไม่พบข้อมูลนั้นในเอกสาร
suzanshakya

19
@suzanshakya ความยาวของขนาดอาร์เรย์ที่ร้องขอツ
vyegorov

5
สิ่งนี้จะส่งกลับnullและ3แทนที่จะเป็น0และ3สำหรับตัวอย่าง OPs ควรส่งเสริมการใช้cardinalityเมื่อยอมรับคำตอบอย่างแน่นอนเนื่องจากใช้งานได้ง่ายขึ้นและคาดไม่ถึง (ฉันคิดว่าการใช้อาร์เรย์ 99.999% เป็นมิติเดียว)
EoghanM


9

สมมติว่าขนาดของอาร์เรย์จะเป็น 1 เสมอไม่ใช่สิ่งที่ฉันรู้สึกสบายใจฉันจึงเลือกสิ่งต่อไปนี้:

SELECT coalesce(array_length(id, 1), 0) as size FROM example;

เป็นเวลาอย่างน้อยหนึ่งทศวรรษ แต่เราเคยทำอะไรมามากมายcoalesceและมันก็มีประโยชน์มาก บางทีฉันอาจจะเอื้อมมือไปเพื่อความสะดวกสบาย


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.