복붙노트

[SQL] 어떻게 분류 번호가 포함 SQL 서버에 VARCHAR 컬럼을합니까?

SQL

어떻게 분류 번호가 포함 SQL 서버에 VARCHAR 컬럼을합니까?

나는 문자 또는 숫자 중 하나를 포함 할 수있는 SQL Server 2000 데이터베이스에서 VARCHAR 컬럼이 있습니다. 이 응용 프로그램은 고객의 프런트 엔드에 구성하는 방법에 따라 달라집니다.

이 숫자를 포함 않을 때, 나는 그것이 예를 들어, 숫자 정렬하려면 "1", "2", "10"대신에 "1", "10"로, "2". (예 : 'A1'과 같은) 단지 문자를 포함하는 필드, 또는 문자와 숫자가 정상으로 알파벳 순으로 정렬 할 수 있습니다. 예를 들어,이 수용 가능한 정렬 순서 일 것이다.

1
2
10
A
B
B1

이를 달성하는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.모두 동일한 문자열의 길이가되도록 하나의 가능한 해결책은 패드 앞의 문자와 숫자 값이다.

    모두 동일한 문자열의 길이가되도록 하나의 가능한 해결책은 패드 앞의 문자와 숫자 값이다.

    여기서 그 방법을 사용한 예이다 :

    select MyColumn
    from MyTable
    order by 
        case IsNumeric(MyColumn) 
            when 1 then Replicate('0', 100 - Len(MyColumn)) + MyColumn
            else MyColumn
        end
    

    100은 그 컬럼의 실제 길이로 대체되어야한다.

  2. ==============================

    2.이 작업을 수행 할 수있는 몇 가지 방법이 있습니다.

    이 작업을 수행 할 수있는 몇 가지 방법이 있습니다.

    하나는 것

    SELECT
     ...
    ORDER BY
      CASE 
        WHEN ISNUMERIC(value) = 1 THEN CONVERT(INT, value) 
        ELSE 9999999 -- or something huge
      END,
      value
    

    (일종의 마지막에 비 수치에 대한 큰 값)를 int로 변환 모든 것을 BY 주문의 첫 번째 부분은 마지막 부분은 영문자을 담당한다.

    참고이 쿼리의 성능이 적당히 무시 무시한 대량의 데이터에 적어도 아마입니다.

  3. ==============================

    3.

    SELECT *, CONVERT(int, your_column) AS your_column_int
    FROM your_table
    ORDER BY your_column_int
    

    또는

    SELECT *, CAST(your_column AS int) AS your_column_int
    FROM your_table
    ORDER BY your_column_int
    

    둘 다 내가 생각하는 상당히 휴대용입니다.

  4. ==============================

    4.

    select
      Field1, Field2...
    from
      Table1
    order by
      isnumeric(Field1) desc,
      case when isnumeric(Field1) = 1 then cast(Field1 as int) else null end,
      Field1
    

    이것은 당신이 당신의 질문에이 순서대로 값을 반환합니다.

    또 다른 방법은 당신이 문제의 그 다음, 제 1 및 열을 기준으로 정렬 한 후 데이터의 정수 사본을 저장하고있는 테이블에 다른 열을 추가하는 것입니다 수 있도록 성능, 캐스팅 진행하는 모든 너무 큰되지 않습니다. 이것은 분명히 테이블에 삽입 또는 업데이트 데이터가 모두 열을 채울 수 있다는 논리에 약간의 변화가 필요합니다. 그 중 하나는 나 데이터가 삽입되거나 업데이트 될 때마다 두 번째 열을 채우는 테이블에 트리거를 넣어.

  5. ==============================

    5.나는 "순서"부분에이 글을 쓰는 아주 간단한 방법으로 해결

    나는 "순서"부분에이 글을 쓰는 아주 간단한 방법으로 해결

    ORDER BY (
    sr.codice +0
    )
    ASC
    

    이 사실 내가 정렬 다음을했다, 아주 잘 작동하는 것 같다 :

    16079   Customer X 
    016082  Customer Y
    16413   Customer Z
    

    그래서 16082의 앞의 0이 제대로 간주됩니다.

  6. ==============================

    6.정수가 너무 짧은 수 있습니다 당신은 항상 BIGINT에 VARCHAR 열을 변환 할 수 있습니다 ...

    정수가 너무 짧은 수 있습니다 당신은 항상 BIGINT에 VARCHAR 열을 변환 할 수 있습니다 ...

    select cast([yourvarchar] as BIGINT)
    

    하지만 당신은 항상 알파 문자에 관심을 가져야

    where ISNUMERIC([yourvarchar] +'e0') = 1
    

    의 + 'E0'는 http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/isnumeric-isint-isnumber에서 온다

    이 명세서로 이어질 것

    SELECT
      *
    FROM
      Table
    ORDER BY
       ISNUMERIC([yourvarchar] +'e0') DESC
     , LEN([yourvarchar]) ASC
    

    첫 번째 정렬 열은 상단에 숫자 둘 것이다. 길이에 의해 제 2 종류가 있으므로 10 의지 (어느 것이 바보!) 0001보다 선행

    두 번째 버전이 리드 :

    SELECT
          *
        FROM
          Table
        ORDER BY
           ISNUMERIC([yourvarchar] +'e0') DESC
         , RIGHT('00000000000000000000'+[yourvarchar], 20) ASC
    

    (! 올바른) 두 번째 열은 이제 올바른 순서 앞에 0 (0,01,10,0100 ...)와 '0', 그래서 자연 정렬 풋 정수로 바로 패딩을 얻는다 - 그러나 모든 알파 '0'으로 향상 될 것입니다 -chars (성능)

    그래서 세 번째 버전 :

     SELECT
              *
            FROM
              Table
            ORDER BY
               ISNUMERIC([yourvarchar] +'e0') DESC
             , CASE WHEN ISNUMERIC([yourvarchar] +'e0') = 1
                    THEN RIGHT('00000000000000000000' + [yourvarchar], 20) ASC
                    ELSE LTRIM(RTRIM([yourvarchar]))
               END ASC
    

    단지 손질 취득 및 알파 - 바로 숫자를 정렬 - 지금 번호는 첫 번째 문자 0' (물론, 길이 (20)가 향상 될 수있다) '패딩 얻을

  7. ==============================

    7.이것은 작동하는 것 같다 :

    이것은 작동하는 것 같다 :

    select your_column  
    from your_table  
    order by   
    case when isnumeric(your_column) = 1 then your_column else 999999999 end,  
    your_column   
    
  8. ==============================

    8.

    SELECT FIELD FROM TABLE
    ORDER BY 
      isnumeric(FIELD) desc, 
      CASE ISNUMERIC(test) 
        WHEN 1 THEN CAST(CAST(test AS MONEY) AS INT)
        ELSE NULL 
      END,
      FIELD
    

    이 링크 당로서 당신은 INT 다음 숫자로 피할 주문 '$'돈에 캐스트 할 필요가있다.

  9. ==============================

    9.이 쿼리는 당신을 위해 도움이됩니다. 이러한 질의에서, 열은 데이터 varchar 형 좋은으로 배치되어 보유 order.For 예 - 데이터는이 칼럼 - G1, G34, G10, G3. 그래서,이 쿼리를 실행 한 후, 당신은 결과를 볼 : - G1, G10, G3, G34을.

    이 쿼리는 당신을 위해 도움이됩니다. 이러한 질의에서, 열은 데이터 varchar 형 좋은으로 배치되어 보유 order.For 예 - 데이터는이 칼럼 - G1, G34, G10, G3. 그래서,이 쿼리를 실행 한 후, 당신은 결과를 볼 : - G1, G10, G3, G34을.

    SELECT *,
           (CASE WHEN ISNUMERIC(column_name) = 1 THEN 0 ELSE 1 END) IsNum
    FROM table_name 
    ORDER BY IsNum, LEN(column_name), column_name;
    
  10. ==============================

    10.저도 같은 문제를 가지고 때 당신을 도울 수있다, 나는이 시도했다.

    저도 같은 문제를 가지고 때 당신을 도울 수있다, 나는이 시도했다.

    고르다 * 탭에서 ORDER BY IIF, TRY_CAST (브로 AS INT) (TRY_CAST (브로 AS INT)은 NULL, 1 0,);

  11. ==============================

    11.

     SELECT *,
           ROW_NUMBER()OVER(ORDER BY CASE WHEN ISNUMERIC (ID)=1 THEN CONVERT(NUMERIC(20,2),SUBSTRING(Id, PATINDEX('%[0-9]%', Id), LEN(Id)))END DESC)Rn ---- numerical
            FROM
                (
    
            SELECT '1'Id UNION ALL
            SELECT '25.20' Id UNION ALL
    
        SELECT 'A115' Id UNION ALL
        SELECT '2541' Id UNION ALL
        SELECT '571.50' Id UNION ALL
        SELECT '67' Id UNION ALL
        SELECT 'B48' Id UNION ALL
        SELECT '500' Id UNION ALL
        SELECT '147.54' Id UNION ALL
        SELECT 'A-100' Id
        )A
    
        ORDER BY 
        CASE WHEN ISNUMERIC (ID)=0                                /* alphabetical sort */ 
             THEN CASE WHEN PATINDEX('%[0-9]%', Id)=0
                       THEN LEFT(Id,PATINDEX('%[0-9]%',Id))
                       ELSE LEFT(Id,PATINDEX('%[0-9]%',Id)-1)
                  END
        END DESC
    
  12. from https://stackoverflow.com/questions/119730/how-do-i-sort-a-varchar-column-in-sql-server-that-contains-numbers by cc-by-sa and MIT license