숫자로 된 SQL 주문 문자열
VARCHAR
MySQL 데이터베이스에 저장된 숫자가 있습니다. INT
상황에 따라 다른 것으로 만들 수 없습니다 .
정렬하는 동안 숫자가 아닌 문자로 사용합니다.
데이터베이스에서 나는
1 2 3 4 5 6 7 8 9 10...
내 페이지에는 다음과 같은 순서 목록이 표시됩니다.
1 10 2 3 4 5 6 7 8 9
숫자가 오름차순으로 표시되도록하려면 어떻게해야합니까?
가능하면 숫자 만 저장하는 경우 가능하면 열의 데이터 유형을 숫자로 변경해야합니다.
당신이 할 수없는 경우 다음에 열 값을 캐스팅 integer
명시 적 으로
select col from yourtable
order by cast(col as unsigned)
또는 암시 적 으로 예를 들어 수로 변환하는 수학적 연산으로
select col from yourtable
order by col + 0
BTW MySQL은 문자열을 왼쪽에서 오른쪽으로 변환합니다. 예 :
string value | integer value after conversion
--------------+--------------------------------
'1' | 1
'ABC' | 0 /* the string does not contain a number, so the result is 0 */
'123miles' | 123
'$123' | 0 /* the left side of the string does not start with a number */
단일 캐스트를 사용하지 않는 다른 방법.
(주조가 허용되지 않는 JPA 2.0을 사용하는 사람)
select col from yourtable
order by length(col),col
편집 : 양의 정수에 대해서만 작동
내가 정렬하는 열에는 알파와 숫자의 조합이 있으므로이 게시물의 제안을 시작점으로 사용하여이를 생각해 냈습니다.
DECLARE @tmp TABLE (ID VARCHAR(50));
INSERT INTO @tmp VALUES ('XYZ300');
INSERT INTO @tmp VALUES ('XYZ1002');
INSERT INTO @tmp VALUES ('106');
INSERT INTO @tmp VALUES ('206');
INSERT INTO @tmp VALUES ('1002');
INSERT INTO @tmp VALUES ('J206');
INSERT INTO @tmp VALUES ('J1002');
SELECT ID, (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) IsNum
FROM @tmp
ORDER BY IsNum, LEN(ID), ID;
결과
ID
------------------------
106
206
1002
J206
J1002
XYZ300
XYZ1002
도움이 되었기를 바랍니다
또 다른 간단한 방법
ORDER BY ABS(column_name)
변환하는 또 다른 방법.
문자열 필드가있는 경우 다음과 같은 방법으로 필드 또는 숫자 부분을 변환 할 수 있습니다. 선행 0을 추가하여 모든 정수 문자열을 동일한 길이로 만듭니다.
ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( stringfield ) ) , stringfield )
또는 'tensymbols13', 'tensymbols1222'등과 같은 필드의 일부로 주문하십시오.
ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) )
이것은 나를 위해 작동합니다.
select * from tablename
order by cast(columnname as int) asc
나는 또한 문자 접두사가있는 정렬 필드를 찾고있었습니다. 여기 내가 해결책을 찾은 것이 있습니다. 이것은 누가 같은 솔루션을 찾는 데 도움이 될 수 있습니다.
필드 값 :
FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789
select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc
SUBSTRING(field,3,9)
9는 최대 9 자리 정수 값을 보유하기에 충분하기 때문에 9를 넣습니다.
결과는 123456789 123456788 123456787 ... 100 99 ... 2 1입니다.
This will handle negative numbers, fractions, string, everything:
ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;
Alter your field to be INT instead of VARCHAR.
I can not make them INT due to some other depending circumstances.
Then fix the depending circumstances first. Otherwise you are working around the real underlying issue. Using a MySQL CAST is an option, but it's masking your bad schema which should be fixed.
참고URL : https://stackoverflow.com/questions/11808573/sql-order-string-as-number
'Programming' 카테고리의 다른 글
ImportError : 'django.core.urlresolvers'라는 모듈이 없습니다. (0) | 2020.07.16 |
---|---|
액션 이미지 MVC3 면도기 (0) | 2020.07.16 |
그룹화 된 데이터에서 첫 번째 및 마지막 행을 선택하십시오. (0) | 2020.07.16 |
Java에서 단일 문자열 정렬 (0) | 2020.07.16 |
DFS와 BFS O (V + E)의 시간이 복잡한 이유 (0) | 2020.07.16 |