복붙노트

[SQL] SQL에서 숫자가 포함 된 문자열 열을 정렬?

SQL

SQL에서 숫자가 포함 된 문자열 열을 정렬?

나는 (숫자를 포함) 문자열 열을 정렬하려합니다.

// SELECT `name` FROM `mytable` ORDER BY `name` ASC
+----------+
+-- name --+
+----------+
+-- a 1 ---+
+-- a 12 --+
+-- a 2 ---+
+-- a 3 ---+

당신은 MySQL의 자연 정렬 알고리즘 (대부분의 응용 프로그램에 대한 확인되는) 1 후 (12)를 배치합니다 참조하지만 결과는 다음과 같이 분류되어야 할, 그래서 나는 고유 한 요구 사항이 있습니다.

+----------+
+-- name --+
+----------+
+-- a 1 ---+
+-- a 2 ---+
+-- a 3 ---+
+-- a 12 --+

그냥 SQL과 가능한가, 아니면 응용 프로그램 수준에서 결과 집합을 조작 할 수 있나요?

해결법

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

    1.그것은이 작동합니다 WORD_space_NUMBER 항상 가정에 간다 :

    그것은이 작동합니다 WORD_space_NUMBER 항상 가정에 간다 :

    SELECT   *
    FROM     table
    ORDER BY CAST(SUBSTRING(column,LOCATE(' ',column)+1) AS SIGNED)
    

    사용 위치는 뒤에 숫자를 잡아 문자열, 공간을 찾기 위해, 그리고 CAST는 유사한 값을 확인합니다.

    컬럼에 다른 패턴이 있으면 저에게 알려 주시면 더 나은 해결 방법을 고안하려고합니다.

    작업에 입증 된 편집 :

    mysql> INSERT INTO t (st) VALUES ('a 1'),('a 12'),('a 6'),('a 11');
    Query OK, 4 rows affected (0.00 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> SELECT * FROM t ORDER BY st;
    +----+------+
    | id | st   |
    +----+------+
    |  1 | a 1  |
    |  4 | a 11 |
    |  2 | a 12 |
    |  3 | a 6  |
    +----+------+
    4 rows in set (0.00 sec)
    
    mysql> SELECT * FROM t ORDER BY CAST(SUBSTRING(st,LOCATE(' ',st)+1) AS SIGNED);
    +----+------+
    | id | st   |
    +----+------+
    |  1 | a 1  |
    |  3 | a 6  |
    |  4 | a 11 |
    |  2 | a 12 |
    +----+------+
    
    mysql> INSERT INTO t (st) VALUES ('b 1'),('b 12'),('b 6'),('b 11');
    Query OK, 4 rows affected (0.00 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> SELECT * FROM t ORDER BY CAST(SUBSTRING(st,LOCATE(' ',st)+1) AS SIGNED);
    +----+------+
    | id | st   |
    +----+------+
    |  1 | a 1  |
    |  5 | b 1  |
    |  3 | a 6  |
    |  7 | b 6  |
    |  4 | a 11 |
    |  8 | b 11 |
    |  2 | a 12 |
    |  6 | b 12 |
    +----+------+
    8 rows in set (0.00 sec)
    
    mysql> SELECT * FROM t ORDER BY LEFT(st,LOCATE(' ',st)), CAST(SUBSTRING(st,LOCATE(' ',st)+1) AS SIGNED);
    +----+------+
    | id | st   |
    +----+------+
    |  1 | a 1  |
    |  3 | a 6  |
    |  4 | a 11 |
    |  2 | a 12 |
    |  5 | b 1  |
    |  7 | b 6  |
    |  8 | b 11 |
    |  6 | b 12 |
    +----+------+
    8 rows in set (0.00 sec)
    

    내 절름발이 테이블 / 열 이름을 무시하지만, 나에게 정확한 결과를 제공합니다. 또한 문자 접두사와 숫자를 깨고 더 조금 추가 된 두 종류의 갔다.

    편집하다

  2. ==============================

    2.이 시도 할 수 있습니다 :

    이 시도 할 수 있습니다 :

    ORDER BY CASE
      WHEN ISNUMERIC(column) THEN cast(column as int) 
      else ascii(column[1,1]) 
    end
    
  3. ==============================

    3.MySQL의 CAST / 변환 기능에서보세요.

    MySQL의 CAST / 변환 기능에서보세요.

    SELECT name FROM mytable ORDER BY CAST(name AS INTEGER) ASC;
    

    편집하다: 본인은 :

    ...하지만 바로 결과 세트를 살펴했다. 는 A가 실제로 또한 내용의 일부인가? 그렇다면, 당신은 단지 숫자 값과 캐스트를 추출하는 MID와 같은 기능을 사용할 수 있습니다.

    모든 행은 단지 변화없이 포함되어있는 경우, 당신은뿐만 아니라 그것을 생략 할 수 ...

  4. ==============================

    4.또 다른 옵션은 패드 수의 좌측 공간과 문자열 (즉, 단어 개수 사이에 공간을 추가)과 같이 comething, 정렬 결과 문자열을 사용할 수있다 :

    또 다른 옵션은 패드 수의 좌측 공간과 문자열 (즉, 단어 개수 사이에 공간을 추가)과 같이 comething, 정렬 결과 문자열을 사용할 수있다 :

    ORDER BY INSERT(
      column,
      LOCATE(' ', column),
      0,
      SPACES(20 - LENGTH(column) + LOCATE(' ', column))
    )
    

    이 문자열은 "(S) 번호 다음에 공백 단어 '패턴으로 간주되고, 수는 음이 아닌 것으로 간주된다 (또는 부정확하게 정렬 할 것이다). 하드 코드 (20)는 임의로 선택하고 문자열의 숫자 부분의 최대 가능 길이로되어있다.

  5. ==============================

    5.여기에 내가 변환을 사용하여 쿼리 다음에 또 다른 해결책을 발견

    여기에 내가 변환을 사용하여 쿼리 다음에 또 다른 해결책을 발견

    select * from tablename where columnname like '%a%' order by Convert(smallint,Replace(columnname,'a',''))
    
  6. from https://stackoverflow.com/questions/4939518/sorting-string-column-containing-numbers-in-sql by cc-by-sa and MIT license