번호로 정렬하는 SQL-1,10,11,12 대신 1,2,3,4 등


87

값이 1-999 인 내 데이터베이스의 숫자 열로 주문하려고합니다.

내가 사용할 때

ORDER_BY registration_no ASC

나는 얻다….

1
101
102
103
104
105
106
107
108
109
11
110
Etc…

따라서 번호가 아닌 첫 번째 숫자로 정렬하는 것으로 보입니다.

값별로 주문하려는 경우 사용할 SQL을 아는 사람이 있습니까? 그래서 1,2,3,4,5,6


11
이 동작에 직면하고 있기 때문에 열이 varchar 유형입니다.
Meherzad 2013 년

registration_no 열의 데이터 유형은 무엇입니까?
Praveen Prasannan 2013 년

9
order by registration_no + 0 asc문제를 해결하는 데 사용 합니다.
Meherzad 2013 년

10
문자 열에 숫자를 저장 해서는 안됩니다 . 귀하의 문제는 해당 오류의 직접적인 결과입니다.
a_horse_with_no_name

1
내 열은 Varchar이고 저장하는 데이터는 Class 10 / Class 9 / Class 8입니다. 이제 Class 10은 Class 8보다 먼저 나옵니다. display_order 열에 대해 수행하지 않고 어떻게이 문제를 해결할 수 있습니까?
Vishnoo Rath

답변:


142

로 저장 될 때 양의 정수로 정렬하는 한 가지 방법 varchar은 먼저 길이로 정렬 한 다음 값으로 정렬하는 것입니다.

order by len(registration_no), registration_no

이는 열에 숫자가 아닌 값이 포함될 수있는 경우 특히 유용합니다.

참고 : 일부 데이터베이스에서는 문자열 길이를 가져 오는 함수가 length()대신 호출 될 수 있습니다 len().


1
이것은 모든 경우에 작동하지 않습니다. 머리 꼭대기에서 작동하지 않는 경우는 정수의 혼합입니다. 음수, 앞에 0이있는 숫자, 분수와 단어와 숫자가 결합 된 숫자.
WonderWorker

10
@ Knickerless-Noggins. . . 답의 첫 문장을 읽으십시오. 꽤 분명하다고 생각합니다.
Gordon Linoff

@GordonLinoff가 동일한 열로 두 번 주문하는 것은 CPU와 메모리 집약적이지 않습니까?
loneStar

@Achyuth. . . 의 키 수는 order by성능에 거의 영향을주지 않습니다.
Gordon Linoff

1
Oracle SQL의 경우 length()대신 사용len()
Stevoisiak

62
ORDER_BY cast(registration_no as unsigned) ASC

값을 명시 적으로 숫자로 변환합니다. 같은 것을 달성 할 수있는 또 다른 가능성은

ORDER_BY registration_no + 0 ASC

암묵적인 대화를 강요합니다.

실제로 테이블 정의를 확인하고 변경해야합니다. 데이터 유형을 int이와 같이 변경할 수 있습니다.

ALTER TABLE your_table MODIFY COLUMN registration_no int;

13

SQL Server를 사용하는 경우 :

ORDER_BY cast(registration_no as int) ASC

4
ORDER_BY cast(registration_no as unsigned) ASC

경고와 함께 원하는 결과를 제공합니다.

따라서

ORDER_BY registration_no + 0 ASC

SQL 경고없이 깨끗한 결과를 얻으려면.


왜 일을 + 0하는지 설명해 주 시겠습니까? 내 데이터 세트에서 테스트했으며 실제로 작동하지만 이유가 궁금합니다. 주문하기 전에 숫자로 변환합니까?
Joshua Pinter

2

열 유형이 STRING (CHAR, VARCHAR 등)이고 정렬 절차가 문자열로 정렬한다고 가정합니다. 해야 할 일은 값을 숫자 값으로 변환하는 것입니다. 이를 수행하는 방법은 사용하는 SQL 시스템에 따라 다릅니다.


1

때로는 텍스트와 혼합 된 숫자를 저장해야하는 선택의 여지가 없습니다. 응용 프로그램 중 하나에서 전자 상거래 사이트에 사용하는 웹 사이트 호스트는 목록에서 동적으로 필터를 만듭니다. 필드별로 정렬 할 수있는 옵션은 없지만 표시된 텍스트입니다. 2 "~ 8"9 "~ 12"13 "~ 15"등의 목록으로 구성된 필터를 원할 때 13-2-9가 아닌 2-9-13을 정렬하는 데 필요했습니다. 숫자 값 읽기. 그래서 가장 긴 숫자의 길이와 함께 SQL Server 복제 기능을 사용하여 짧은 숫자를 선행 공백으로 채웠습니다. 이제 20은 3 다음에 정렬됩니다.

항목 유형 및 클래스에 대한 최소 및 최대 길이, 너비 등을 제공하는보기로 작업 중이 었으며 여기에 텍스트를 수행 한 방법의 예가 있습니다. (LB n Low 및 LB n High는 5 개 길이 브래킷의 Low 및 High 끝입니다.)

REPLICATE(' ', LEN(LB5Low) - LEN(LB1High)) + CONVERT(NVARCHAR(4), LB1High) + '" and Under' AS L1Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB2Low)) + CONVERT(NVARCHAR(4), LB2Low) + '" to ' + CONVERT(NVARCHAR(4), LB2High) + '"' AS L2Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB3Low)) + CONVERT(NVARCHAR(4), LB3Low) + '" to ' + CONVERT(NVARCHAR(4), LB3High) + '"' AS L3Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB4Low)) + CONVERT(NVARCHAR(4), LB4Low) + '" to ' + CONVERT(NVARCHAR(4), LB4High) + '"' AS L4Text,
CONVERT(NVARCHAR(4), LB5Low) + '" and Over' AS L5Text

1

나는 데이터에 "PAD"를 선호합니다. MySql은이를 LPAD라고 부르지 만 SQL Server에서 동일한 작업을 수행 할 수 있습니다.

ORDER BY  REPLACE(STR(ColName, 3), SPACE(1), '0') 

이 수식은 열의 길이 3을 기준으로 선행 0을 제공합니다.이 기능은 ORDER BY 이외의 다른 상황에서 매우 유용하므로이 옵션을 제공하고 싶었습니다.

결과 : 1은 001이되고 10은 010이되고 100은 동일하게 유지됩니다.


0

이 문제는 CHAR, VARCHAR 또는 TEXT 데이터 유형에서 열을 선언했기 때문입니다. 데이터 유형을 INT, BIGINT 등으로 변경하면됩니다. 이렇게하면 맞춤 주문 문제가 해결됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.