Làm thế nào để đặt hàng theo các phiên bản phát hành phần mềm điển hình như XYZ?


13

Đưa ra bảng "SoftwareRelease":

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

Làm thế nào để tôi sản xuất đầu ra này?

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

Câu trả lời:


22

Để tạo đầu ra mong muốn của bạn, bạn có thể chỉ cần:

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

Người ta có thể truyền toàn bộ một textmảng thành một integermảng (để sắp xếp 9trước 10).
Một loại có thể ORDER BYmảng. Điều này giống như thứ tự của từng yếu tố. Và mảng ngắn hơn đến trước những mảng dài hơn với phần đầu giống hệt nhau.

db <> fiddle ở đây
Fiddle SQL cũ.


1
Điều đó thật tuyệt. Bằng cách nào đó, loại này thiếu các giá trị một cách chính xác, mà không phải chỉ định thứ tự null: (1.6.9 -> 1.7 -> 1.7.1), thay vì (1.6.9 -> 1.7.1 -> 1.7). Chấp nhận cái này
Chris Betti

2
Nếu bạn đang xử lý các phiên bản Maven hoặc phiên bản có thể chứa các ký tự không phải là số, trước tiên bạn có thể xóa các ký tự không phải là số:string_to_array(regexp_replace(version, '[^0-9.]', '', 'g'), '.')::int[]
Samuel

Tôi sử dụng điều này để tìm phiên bản tối đa và nó hoạt động rất tốtSELECT 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

Nếu bạn mong đợi nhiều phần tử hơn trong chuỗi phiên bản, chỉ cần sử dụng nhiều chỉ mục mảng hơn. Nếu chỉ mục không tồn tại, kết quả sẽ là null (ví dụ: v[10]sẽ trả về null)


Bạn có cần phải chuyển đổi chúng thành số? Nếu không, tôi sẽ mong đợi 10được giữa 12.
JNK

Điều này được xác nhận bởi câu đố của bạn ...
JNK

Xóa của tôi ủng hộ điều này. string_to_array đơn giản hơn nhiều so với regex.
Chris Betti

@JNK: đó là những gì v[1]::intvề. Nó ép chuỗi thành một số nguyên.
a_horse_with_no_name

Thay đổi duy nhất tôi thực hiện đối với SQL của bạn là thứ tự theo. Tôi đề nghị loại bỏ desc và điều đó sẽ tạo ra tập kết quả mà @Chris Betti đang tìm kiếm.
CN

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.