문자와 숫자가 포함된 SQL Server 2005 varchar 열에 숫자 순서를 강제 적용하시겠습니까?

StackOverflow https://stackoverflow.com/questions/75361

  •  09-06-2019
  •  | 
  •  

문제

'연산자(1)' 문자열을 포함하는 열이 있고 지금까지 '연산자(600)'까지 계속됩니다.

나는 그것들을 숫자로 주문하고 싶었고 나는 그것을 생각해 냈습니다.

select colname from table order by 
cast(replace(replace(colname,'Operator (',''),')','') as int)

그것은 매우 추악합니다.

더 나은 제안이 있나요?

도움이 되었습니까?

해결책

InStr()/SubString(), Operator(1)을 Operator(001)로 변경, n을 Operator(n)에 별도로 저장하거나 추악한 문자열 조작을 숨기는 계산된 열을 생성하는 것입니다.당신이 가지고 있는 것은 괜찮은 것 같습니다.

다른 팁

만약 당신이 정말로 가지다 데이터를 현재 형식으로 유지하려면 숫자 정렬 순서 열을 추가하는 것이 더 나은 솔루션입니다. 그런 다음 사용자 정의 함수에서 텍스트 조작을 래핑하는 것을 고려하십시오.

dbo.udfSortOperator(colname)를 통해 테이블 ​​순서에서 colname을 선택합니다.

덜 추악하고 추상화를 제공합니다.함수 호출에 대한 추가 오버헤드가 있지만 히트가 너무 많지 않은 데이터베이스 서버에 있는 수천 개의 행이 포함된 테이블에서는 큰 문제가 되지 않습니다.필요에 따라 나중에 최적화할 수 있도록 기능에 메모를 작성하세요.

내 대답은 문제를 바꾸는 것입니다.가능하다면 테이블에 OperatorNumber 필드를 추가하겠습니다.업데이트/삽입 루틴을 변경하여 숫자를 추출하고 저장합니다.이렇게 하면 문자열 변환 적중이 레코드당 한 번만 발생합니다.

순서 지정 논리에서는 쿼리가 실행될 때마다 문자열 변환이 필요합니다.

글쎄, 먼저 해당 열의 의미를 정의하십시오.연산자는 이름이므로 문자를 사용하여 정당화할 수 있습니까?아니면 숫자인가요?

필드가 이름인 경우 문자를 사용하고 고정 길이를 결정하려고 합니다.모든 연산자 이름 왼쪽을 0으로 채웁니다.연산자에 대한 명명 규칙을 정의합니다(I.E.편지가 없습니다.또는 "A001"과 같은 시리즈에서 사용할 코드)

인덱스는 서버의 물리적 데이터를 정렬합니다.그리고 적절하게 정의된 텍스트 이름 지정은 쿼리에서 해당 텍스트를 정렬합니다.당신은 둘 다 원할 것입니다.

연산자가 숫자인 경우 해당 열의 데이터 유형이 잘못된 것이므로 변경해야 합니다.

인덱싱된 계산 열

주문하시거나 다른 문의사항이 있으시면 operator 열의 경우 숫자 값에 대한 계산 열을 만들고 이에 대한 인덱스를 추가하는 것이 좋습니다.이렇게 하면 계산된/지속적인 열이 제공됩니다(모순처럼 들리지만 그렇지 않습니다).

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