문제

nvarchar 열(단어 및 숫자)에 혼합된 데이터가 있습니다.이 열의 데이터를 숫자 순서로 정렬하는 가장 빠른 방법은 무엇입니까?

결과 예:

  • 1
  • 2
  • 3
  • ...
  • 10
  • 11
  • ...
  • 아아아아
  • 아아아
  • ...
도움이 되었습니까?

해결책

이것을 사용하십시오 :

ORDER BY
    CASE WHEN ISNUMERIC(column) = 1 THEN 0 ELSE 1 END,
    CASE WHEN ISNUMERIC(column) = 1 THEN CAST(column AS INT) ELSE 0 END,
    column

이것은 예상대로 작동합니다.


메모: 당신은 말한다 가장 빠른 방법. 이 SQL은 제가 생산하기에 빠르지만 실행 계획은 테이블 스캔을 보여주고 스칼라 계산이 이어집니다. 이것은 해당 열의 모든 값을 포함하는 임시 결과를 생성 할 수 있습니다. 실행하는 것은 빠르지 않을 수 있습니다.

다른 팁

0을 사용하여 숫자를 패드하고 정렬하면 원하는 결과를 얻을 수 있습니다. 0의 숫자가 Varchar 열의 크기와 일치하는지 확인해야합니다.

이 예를 살펴보세요 ...

Declare @Temp Table(Data VarChar(20))

Insert Into @Temp Values('1')
Insert Into @Temp Values('2')
Insert Into @Temp Values('3')
Insert Into @Temp Values('10')
Insert Into @Temp Values('11')
Insert Into @Temp Values('aaaa')
Insert Into @Temp Values('aaab')
Insert Into @Temp Values('b')
Insert Into @Temp Values('ba')
Insert Into @Temp Values('ba')

Select * From @Temp
Order By Case When IsNumeric(Data) = 1 
              Then Right('0000000000000000000' + Data, 20) 
              Else Data End

또한 Case 문의 각 지점에서 동일한 데이터 유형을 반환하는 경우 CASE 문을 사용할 때 중요합니다. 그렇지 않으면 잘못된 결과 또는 오류가 발생합니다.

-존재를 확인하십시오
존재하는 경우 (dbo.sysobjects에서 * select [id] = object_id (n'dbo.t ') 및 ObjectProperty (id, n'isusertable') = 1)
드롭 테이블 dbo.t
가다

-예제 테이블을 생성하십시오
테이블 생성 dbo.t (c varchar (10) not null)
Nocount를 설정하십시오

-populate 예제 테이블
dbo.t (c) 값에 삽입 ( '1')
dbo.t (c) 값 ( '2')에 삽입
DBO에 삽입 (C) 값 ( '3')
dbo.t (c) 값 ('10 ')에 삽입
dbo.t (c) 값에 삽입 ( '11')
dbo.t (c) 값에 삽입 ( 'aaaa')
dbo.t (c) 값에 삽입 ( 'aaab')
dbo.t (c) 값 ( 'b')에 삽입
dbo.t (c) 값에 삽입 ( 'ba')
dbo.t (c) 값에 삽입 ( 'ba')

-데이터를 회전하십시오
DBO에서 C를 선택하십시오
isnumeric (c) = 1 그런 다음 0 else 1 end,
isnumeric (c) = 1 그런 다음 캐스트 (c as int) else 0 end,

데이터를 영숫자 또는 숫자로 처리할 수 있으며 동시에 둘 다 처리할 수는 없습니다.나는 당신이하려는 일이 가능하지 않다고 생각합니다. 데이터 모델이 적절하게 설정되지 않았습니다.

나는 당신이하려는 일이 가능하다고 생각하지 않습니다

이 예제는 잘 작동합니다

SELECT * FROM TableName
ORDER BY CASE WHEN 1 = IsNumeric(ColumnName) THEN Cast(ColumnName AS INT) END

결과는 다음과 같습니다.

  • ...
  • 1
  • 2
  • 3

하지만 먼저 숫자가 필요합니다.

이것은 작동해야합니다 :

select * from Table order by ascii(Column)

캐스트.

SELECT * FROM foo ORDER BY CAST(somecolumn AS int);

SQL Server를 터치 한 지 오래되었으므로 구문은 완전히 부정확 할 수 있습니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top