วิธีการสั่งซื้อโดยทั่วไปซอฟต์แวร์รุ่นเช่น XYZ


13

รับตาราง "SoftwareReleases":

| id | version |
|  1 | 0.9     |
|  2 | 1.0     |
|  3 | 0.9.1   |
|  4 | 1.1     |
|  5 | 0.9.9   |
|  6 | 0.9.10  |

ฉันจะสร้างผลลัพธ์นี้ได้อย่างไร

| id | version |
|  1 | 0.9     |
|  3 | 0.9.1   |
|  5 | 0.9.9   |
|  6 | 0.9.10  |
|  2 | 1.0     |
|  4 | 1.1     |

คำตอบ:


22

ในการสร้างผลลัพธ์ที่คุณต้องการคุณสามารถ:

SELECT id, version
FROM   versions
ORDER  BY string_to_array(version, '.')::int[];

หนึ่งสามารถส่งtextอาร์เรย์ทั้งหมดไปยังintegerอาร์เรย์ (เรียงลำดับ9ก่อน10)
หนึ่งORDER BYประเภทสามารถอาร์เรย์ สิ่งนี้เหมือนกับการสั่งซื้อโดยแต่ละองค์ประกอบ และอาร์เรย์ที่สั้นลงมาก่อนหน้านี้อีกต่อไปที่มีส่วนนำเหมือนกัน

db <> fiddle ที่นี่
Old SQL Fiddle


1
มันเยี่ยมมาก อย่างไรก็ตามค่านี้หายไปอย่างถูกต้องโดยไม่ต้องระบุลำดับของโมฆะ: (1.6.9 -> 1.7 -> 1.7.1) มากกว่า (1.6.9 -> 1.7.1 -> 1.7) ยอมรับอันนี้
Chris Betti

2
หากคุณกำลังจัดการกับเวอร์ชัน Maven หรือเวอร์ชันที่อาจมีอักขระที่ไม่ใช่ตัวเลขคุณสามารถลบอักขระที่ไม่ใช่ตัวเลขได้ก่อน:string_to_array(regexp_replace(version, '[^0-9.]', '', 'g'), '.')::int[]
ซามูเอล

ฉันใช้สิ่งนี้เพื่อค้นหารุ่นสูงสุดและใช้งานได้ดีSELECT max(string_to_array(build_version, '.')::int[]
Joviano Dias

6
select id,
       name, 
       v[1] as major_version,
       v[2] as minor_version,
       v[3] as patch_level
from (
   select id, 
          name, 
          string_to_array(version, '.') as v
   from versions
) t
order by v[1]::int desc, v[2]::int desc, v[3]::int desc;

SQLFiddle: http://sqlfiddle.com/#!15/c9acb/1

หากคุณคาดหวังองค์ประกอบเพิ่มเติมในสตริงเวอร์ชันเพียงแค่ใช้ดัชนีอาร์เรย์มากขึ้น หากดัชนีไม่มีอยู่ผลลัพธ์จะเป็นโมฆะ (เช่นv[10]จะส่งคืนnull)


คุณต้องการแปลงเป็นตัวเลขหรือไม่? มิฉะนั้นผมจะคาดหวัง10ว่าจะอยู่ระหว่างและ1 2
JNK

นี่เป็นการยืนยันโดยซอของคุณ ...
JNK

การลบของฉันเป็นประโยชน์ต่อสิ่งนี้ string_to_array นั้นง่ายกว่า regex มาก
Chris Betti

@JNK: นั่นคือสิ่งที่v[1]::intเป็นเรื่องเกี่ยวกับ มันปลดสตริงให้เป็นจำนวนเต็ม
a_horse_with_no_name

การเปลี่ยนแปลงเดียวที่ฉันทำกับ SQL ของคุณคือการสั่งซื้อโดย ฉันแนะนำให้ถอดออกและนั่นจะสร้างชุดผลลัพธ์ @Chris Betti ที่กำลังมองหา
อาทิตย์ที่

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