2013-06-05 3 views
2

SQL Server 2008을 사용하고 있습니다.SQL Server - 숫자에 자연 순서를 제공하는 데이터 정렬이 있습니까?

테이블에 VarChar 유형의 테이블이 있습니다. 현재 실제로 숫자를 나타내는 문자열로 채워져 있습니다. 죄송하지만 열은 VarChar ('1', '2' ... , '1000')이어야합니다.

해당 필드에 최대 숫자 값을 쿼리하고 싶지만 VarChar이므로 자연스러운 최대 값이 아닌 Lexicographical max 값을 얻습니다.

가 나는 시도하고 그 쿼리에 대한 COLLATE 절을 사용하여이 문제를 해결하고이 link

  1. 에 같은 숫자의 자연 순서를 제공하는 데이터 정렬로 변경됩니다 생각 SQL Server에 대한이 같은 조합이 있습니까 만약 그렇다면 무엇이 쿼리가되어야 하는가?
  2. 이와 같은 데이터 정렬이 필요한 경우이 방법을 사용해야합니까? 그렇지 않으면 캐스팅을 사용해야합니까?

감사합니다. 숫자

에 한 번만 캐스팅 그런 식으로 주조 값입니다 - -

+0

같은

시도 뭔가 아니, 그런 "마법"데이터 정렬이 없습니다. 문자열로 저장되어 있으면 문자열로 정렬됩니다. 기간. 번호가 맞으면 번호 **로 저장해야합니다 ** –

답변

2

숫자에 자연 정렬을 수행 할 조합 옵션이 없습니다.

그러나 모든 값이 정수가 될 것으로 예상되는 경우 값을 정수로 캐스팅 할 수 있습니다.

SELECT MAX(CAST (Value as int)) 
FROM MyTable 
+0

질문에 답변 해 주셔서 감사합니다! 이것에 대한 데이터 정렬이없는 이유를 설명 할 수 있습니까? – Oren

+0

@Oren 콜레 션은 여러 언어를 지원하므로 숫자가 아닌 문자로 작업합니다. 숫자 정렬 알고리즘을 활성화하려면 숫자를 입력해야합니다. 자연 정렬이 필요한 글자와 숫자가 혼합되어 있으면 복잡해 지지만 거기에는 가지 않습니다. – Kami

2

그냥 메모, 세 번째 옵션은 지속 형 계산 열 사용하는 것입니다에 만들거나 업데이트를

-- Create Table with computed column 
CREATE TABLE [dbo].[CCtest] 
(
[myString] [varchar] NULL, 
[myInt] AS (cast(myString as int)) PERSISTED 
) 
GO 

그런 다음 계산 된 열에 인덱스를 만들면됩니다.

2

모든 값이 숫자 인 경우 데이터 정렬이나 테이블 구조를 변경하지 않고 int로 변환 한 값으로 간단하게 정렬 할 수 있습니다.

SELECT * FROM test ORDER BY CONVERT(INT, value); 

An SQLfiddle to test with.