Programming

숫자로 된 SQL 주문 문자열

procodes 2020. 7. 16. 21:18
반응형

숫자로 된 SQL 주문 문자열


VARCHARMySQL 데이터베이스에 저장된 숫자가 있습니다. 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

반응형