[SQL] SQL에서 숫자가 포함 된 문자열 열을 정렬?
SQLSQL에서 숫자가 포함 된 문자열 열을 정렬?
나는 (숫자를 포함) 문자열 열을 정렬하려합니다.
// 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.그것은이 작동합니다 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.이 시도 할 수 있습니다 :
이 시도 할 수 있습니다 :
ORDER BY CASE WHEN ISNUMERIC(column) THEN cast(column as int) else ascii(column[1,1]) end
-
==============================
3.MySQL의 CAST / 변환 기능에서보세요.
MySQL의 CAST / 변환 기능에서보세요.
SELECT name FROM mytable ORDER BY CAST(name AS INTEGER) ASC;
편집하다: 본인은 :
...하지만 바로 결과 세트를 살펴했다. 는 A가 실제로 또한 내용의 일부인가? 그렇다면, 당신은 단지 숫자 값과 캐스트를 추출하는 MID와 같은 기능을 사용할 수 있습니다.
모든 행은 단지 변화없이 포함되어있는 경우, 당신은뿐만 아니라 그것을 생략 할 수 ...
-
==============================
4.또 다른 옵션은 패드 수의 좌측 공간과 문자열 (즉, 단어 개수 사이에 공간을 추가)과 같이 comething, 정렬 결과 문자열을 사용할 수있다 :
또 다른 옵션은 패드 수의 좌측 공간과 문자열 (즉, 단어 개수 사이에 공간을 추가)과 같이 comething, 정렬 결과 문자열을 사용할 수있다 :
ORDER BY INSERT( column, LOCATE(' ', column), 0, SPACES(20 - LENGTH(column) + LOCATE(' ', column)) )
이 문자열은 "(S) 번호 다음에 공백 단어 '패턴으로 간주되고, 수는 음이 아닌 것으로 간주된다 (또는 부정확하게 정렬 할 것이다). 하드 코드 (20)는 임의로 선택하고 문자열의 숫자 부분의 최대 가능 길이로되어있다.
-
==============================
5.여기에 내가 변환을 사용하여 쿼리 다음에 또 다른 해결책을 발견
여기에 내가 변환을 사용하여 쿼리 다음에 또 다른 해결책을 발견
select * from tablename where columnname like '%a%' order by Convert(smallint,Replace(columnname,'a',''))
from https://stackoverflow.com/questions/4939518/sorting-string-column-containing-numbers-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 테이블 또는 열 이름은 숫자로 시작할 수 없습니다? (0) | 2020.05.12 |
---|---|
[SQL] 오라클 포스트 그레스 'DISTINCT ON의 동등한? (0) | 2020.05.12 |
[SQL] MySQL은 OUTPUT 절 (0) | 2020.05.12 |
[SQL] 사용자 정의 집계 함수 (CONCAT) SQL Server의 (0) | 2020.05.12 |
[SQL] SQL : 어떻게 당신이 특정 값을 포함하지 않는 경우에만 그룹을 선택합니까? (0) | 2020.05.12 |