복붙노트

[SQL] 숫자 변환 VARCHAR 정렬

SQL

숫자 변환 VARCHAR 정렬

나는 열을 기준으로 정렬 된 쿼리를 가지고 :

select * from mytable order by column asc — sort table

출력하므로 열 유형은 VARCHAR이다 :

1
10
100
11
12
13

어떻게 내가 출력이 그래서 그들이 숫자 값을 기준으로 정렬 할해야 종류의 경우 :

1
10
11
12
13
100

해결법

  1. ==============================

    1.사용하다:

    사용하다:

    order by cast(column as unsigned) asc
    
  2. ==============================

    2.당신은 INT 전용으로 열을 취급 할 경우이 작업을 사용할 수 있습니다 :

    당신은 INT 전용으로 열을 취급 할 경우이 작업을 사용할 수 있습니다 :

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

    또는이 당신은 INT와 VARCHAR 모두 같은 치료 열을 원하는 경우

    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
    
  3. ==============================

    3.이것은 잘 작동합니다 :

    이것은 잘 작동합니다 :

    
    order by (0 + column) asc
    
    
  4. ==============================

    4.우리는 단순히 약간 선언하여 순서를 수정하면 자연스럽게 필드를 정렬, 당신은 MySQL을 강제 할 수 있습니다 (필드에 의해 순서에 "0"을 추가).

    우리는 단순히 약간 선언하여 순서를 수정하면 자연스럽게 필드를 정렬, 당신은 MySQL을 강제 할 수 있습니다 (필드에 의해 순서에 "0"을 추가).

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

    5.

        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;
    

    변환에 의해 varchar_sort 순서 SELECT * FROM ((actual_user_id 교체 '-', ''), 부호있는 정수) 오름차순

        **Need to sort 1001 and 1002 as well.**
    
  6. from https://stackoverflow.com/questions/1868965/varchar-to-number-conversion-for-sorting by cc-by-sa and MIT license