2009-12-08 4 views
17

Tôi đã một truy vấn theo yêu cầu của column:Varchar để chuyển đổi số để phân loại

select * from mytable order by column asc — sort table 

column loại là varchar, vì vậy sản lượng là:

1 
10 
100 
11 
12 
13 

Làm thế nào tôi nên loại nếu tôi muốn họ sắp xếp theo giá trị số để đầu ra là:

1 
10 
11 
12 
13 
100 
+0

giải thích câu hỏi của bạn tốt hơn. Và tại sao không làm việc cho bạn. – Bozho

+4

Nó không hoạt động vì cột của một varchar và anh ta muốn sắp xếp theo giá trị số. Không phải là khó khăn ... – mmattax

Trả lời

40

Sử dụng:

order by cast(column as unsigned) asc 
11

này nên làm việc cũng như:

 

order by (0 + column) asc 
 
+0

Rất thông minh. Bạn nghĩ ai sẽ thực hiện tốt hơn? –

+0

Tôi không biết ý nghĩa hiệu suất của điều này so với câu trả lời của Pablo. Nếu có ai biết, tôi muốn biết. – mmattax

+0

Ý nghĩa của việc thêm 0 vào cột là gì? –

16

Bạn có thể sử dụng điều này nếu bạn muốn để điều trị column như chỉ INT:

SELECT * FROM mytable ORDER BY column+0; 
1 
10 
11 
12 
13 
100 

Hoặc này nếu bạn muốn để điều trị column như cả INTVARCHAR

SELECT * FROM mytable ORDER BY column+0, column; #this will sort the column by VARCHAR first and then sort it by INT 

abc 
xyz 
1 
10 
11 
12 
13 
100 
+2

Bí quyết tuyệt vời nhất! Cám ơn vì cái này! –

+0

Đây thực sự là một câu trả lời hay và hoàn hảo cho nhu cầu của tôi. – FastTrack

+0

Nếu bạn muốn sắp xếp desc: SELECT * FROM mytable ORDER BY cột + 0 DESC, cột DESC; – Macbric

3
Added a full code script here , but need to sort 1001 and 1002 before - as well. 
We have total 5 solution , means 5 different queries as solution with full script. 


============================================================= 
    SET NAMES utf8; 
    SET foreign_key_checks = 0; 
    SET time_zone = 'SYSTEM'; 
    SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; 

    DROP TABLE IF EXISTS `varchar_sort`; 
    CREATE TABLE `varchar_sort` (
     `user_id` int(11) NOT NULL AUTO_INCREMENT, 
     `actual_user_id` varchar(200) DEFAULT NULL, 
     PRIMARY KEY (`user_id`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

    INSERT INTO `varchar_sort` (`user_id`, `actual_user_id`) VALUES 
    (1, '1001-4'), 
    (2, '1001-1'), 
    (3, '1001-111'), 
    (4, '1002-1'), 
    (5, '1001-66'), 
    (6, '1001-100'), 
    (7, '1001-110'); 


    SELECT user_id,actual_user_id,CONVERT(SUBSTRING_INDEX(actual_user_id,'-',-1),UNSIGNED INTEGER) AS num 
    FROM varchar_sort 
    ORDER BY num; 


    SELECT user_id,actual_user_id 
    FROM varchar_sort 
    ORDER BY CONVERT(SUBSTRING(actual_user_id, 6), SIGNED INTEGER); 


    SELECT user_id,actual_user_id 
    FROM varchar_sort 
    ORDER BY CONVERT(SUBSTRING(actual_user_id, LOCATE('-', actual_user_id) + 1), SIGNED INTEGER); 


    SELECT *, CAST(SUBSTRING_INDEX(actual_user_id, '-', -1) AS UNSIGNED) as num FROM varchar_sort ORDER BY num; 

select * from trật tự varchar_sort bởi chuyển đổi (thay thế (actual_user_id, '-', ''), INTEGER KÝ) asc

**Need to sort 1001 and 1002 as well.** 
+1

Câu trả lời này xứng đáng được yêu hơn rất nhiều. – SuperFamousGuy

3

Nếu chúng ta chỉ đơn giản là thay đổi thứ tự bằng cách tuyên bố hơi (thêm “ +0 ″ tới thứ tự theo trường), bạn có thể buộc MySQL sắp xếp trường một cách tự nhiên.

> select * from mytable order by column+0 asc; 
column 
1 
10 
11 
12 
13 
100