값이 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
등
값이 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
등
order by registration_no + 0 asc
문제를 해결하는 데 사용 합니다.
답변:
로 저장 될 때 양의 정수로 정렬하는 한 가지 방법 varchar
은 먼저 길이로 정렬 한 다음 값으로 정렬하는 것입니다.
order by len(registration_no), registration_no
이는 열에 숫자가 아닌 값이 포함될 수있는 경우 특히 유용합니다.
참고 : 일부 데이터베이스에서는 문자열 길이를 가져 오는 함수가 length()
대신 호출 될 수 있습니다 len()
.
order by
성능에 거의 영향을주지 않습니다.
length()
대신 사용len()
SQL Server를 사용하는 경우 :
ORDER_BY cast(registration_no as int) ASC
ORDER_BY cast(registration_no as unsigned) ASC
경고와 함께 원하는 결과를 제공합니다.
따라서
ORDER_BY registration_no + 0 ASC
SQL 경고없이 깨끗한 결과를 얻으려면.
+ 0
하는지 설명해 주 시겠습니까? 내 데이터 세트에서 테스트했으며 실제로 작동하지만 이유가 궁금합니다. 주문하기 전에 숫자로 변환합니까?
열 유형이 STRING (CHAR, VARCHAR 등)이고 정렬 절차가 문자열로 정렬한다고 가정합니다. 해야 할 일은 값을 숫자 값으로 변환하는 것입니다. 이를 수행하는 방법은 사용하는 SQL 시스템에 따라 다릅니다.
때로는 텍스트와 혼합 된 숫자를 저장해야하는 선택의 여지가 없습니다. 응용 프로그램 중 하나에서 전자 상거래 사이트에 사용하는 웹 사이트 호스트는 목록에서 동적으로 필터를 만듭니다. 필드별로 정렬 할 수있는 옵션은 없지만 표시된 텍스트입니다. 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
나는 데이터에 "PAD"를 선호합니다. MySql은이를 LPAD라고 부르지 만 SQL Server에서 동일한 작업을 수행 할 수 있습니다.
ORDER BY REPLACE(STR(ColName, 3), SPACE(1), '0')
이 수식은 열의 길이 3을 기준으로 선행 0을 제공합니다.이 기능은 ORDER BY 이외의 다른 상황에서 매우 유용하므로이 옵션을 제공하고 싶었습니다.
결과 : 1은 001이되고 10은 010이되고 100은 동일하게 유지됩니다.