Hãy thử điều này:
with a as
(
select * from (values
('1.1.2'),('1.1.3'),('2.1.4 '), ('2.1.5'), ('2.2.1')) as b(c)
)
select c, PARSENAME(c,1),PARSENAME(c,2), PARSENAME(c,3)
from a
order by
convert(int,PARSENAME(c,3)),
convert(int,PARSENAME(c,2)),
convert(int,PARSENAME(c,1))
Lấy cảm hứng từ: http://www.sql-server-helper.com/tips/sort-ip-address.aspx
with a as
(
select * from (values
('1.1.2'),('1.1.3'),('2.1.4 '), ('2.1.5'), ('2.2.1')) as b(c)
),
x as
(
select c,
convert(int,PARSENAME(c,3)) * 100
+ convert(int,PARSENAME(c,2)) * 10
+ convert(int,PARSENAME(c,1)) * 1 as the_value
from a
)
select c from x where the_value = (select MAX(the_value) from x)
Trong phát triển phần mềm, nó là điển hình để tìm một số phiên bản nhỏ mà có hai chữ số trong đó, số của phiên bản don' t có bất kỳ giá trị nào với giá trị của số, do đó phiên bản 1.12 lớn hơn 1.5; để bù đắp cho điều đó, bạn phải pad các chữ số đầy đủ:
-- Use this, the query above is not future-proof :-)
with a as
(
select * from (values
('2.1.4 '), ('2.1.12'), ('2.1.5'), ('2.2.1')) as b(c)
),
x as
(
select c,
convert(int,PARSENAME(c,3)) * 100*100*100
+ convert(int,PARSENAME(c,2)) * 100*100
+ convert(int,PARSENAME(c,1)) * 100 as the_value
from a
)
select c, the_value from x
order by the_value
Output:
2.1.4 2010400
2.1.5 2010500
2.1.12 2011200
2.2.1 2020100
Nếu bạn không đi mà vào xem xét (như với các truy vấn sau đây):
with a as
(
select * from (values
('2.1.4 '), ('2.1.12'), ('2.1.5'), ('2.2.1')) as b(c)
),
x as
(
select c,
convert(int,PARSENAME(c,3)) * 100
+ convert(int,PARSENAME(c,2)) * 10
+ convert(int,PARSENAME(c,1)) * 1 as the_value
from a
)
select c, the_value from x
order by the_value;
-- KorsG's answer has a bug too
with a as
(
select * from (values
('2.1.4 '), ('2.1.12'), ('2.1.5'), ('2.2.1')) as b(c)
),
x as
(
select c,
CAST(REPLACE(c, '.', '') AS int) as the_value
from a
)
select c, the_value from x
order by the_value
Hai truy vấn này sẽ mang lại kết quả tương tự (không chính xác):
c the_value
2.1.4 214
2.1.5 215
2.2.1 221
2.1.12 222
Giá trị của 2.2.1 và 2.1.12 trùng lặp. Điều đó cũng xảy ra khi bạn chỉ xóa các chấm và chuyển trực tiếp chuỗi kết quả thành int. 2.1.12 trở thành hai nghìn một trăm mười hai, 2.2.1 trở thành hai trăm hai mươi mốt người. 2.2.1 lớn hơn 2.1.12, không nhỏ hơn
Nhân các bộ phận và thêm chúng làm thủ thuật. Cảm ơn bạn – Pabuc