복붙노트

[SQL] TSQL - 그것은 정렬 순서를 정의 할 수 있습니까?

SQL

TSQL - 그것은 정렬 순서를 정의 할 수 있습니까?

그것은 반환 된 결과의 정렬 순서를 정의 할 수 있습니까?

나는 정렬 순서는 '오렌지' '사과' '딸기'오름차순 또는 내림차순하지 싶습니다.

나는 ORDER BY는 ASC 또는 DESC을 할 수 있지만 정의 ( '오렌지', '사과', '딸기') 타입 일이 알아?

이는 SQL 서버 2000에서 실행됩니다.

해결법

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

    1.그것은 매우 투박하지만 당신은 주문에 대한 CASE 문을 사용할 수 있습니다 :

    그것은 매우 투박하지만 당신은 주문에 대한 CASE 문을 사용할 수 있습니다 :

    SELECT * FROM Blah 
    ORDER BY CASE MyColumn 
        WHEN 'orange' THEN 1 
        WHEN 'apple' THEN 2 
        WHEN 'strawberry' THEN 3 
        END 
    

    또는, 당신은 정렬 필드와 정렬 순서를 포함하는 보조 테이블을 만들 수 있습니다.

    TargetValue  SortOrder
    orange       1
    apple        2
    strawberry   3
    

    그리고이 새로운 테이블에 테이블을 가입 할 수 있습니다.

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

    2.case 문을 사용합니다 :

    case 문을 사용합니다 :

    ORDER BY CASE your_col
               WHEN 'orange' THEN 1
               WHEN 'apple' THEN 2
               WHEN 'strawberry' THEN 3
             END 
    

    else가와 대체 구문 :

    ORDER BY CASE 
               WHEN your_col = 'orange' THEN 1
               WHEN your_col = 'apple' THEN 2
               WHEN your_col = 'strawberry' THEN 3
               ELSE 4
             END 
    
  3. ==============================

    3.이 단명 요구 될 것입니다 경우, case 문을 사용합니다. 그러나, 당신은 잠시 동안 주위에있을 수있다 생각하고, 항상 오렌지 / 사과 / 딸기 순서가 될 것 (또는하지 않을 경우 - 아래 참조), 당신은 몇 가지 속도를 얻기 위해 일부 디스크 공간을 희생에 대해 생각 할 수 있습니다.

    이 단명 요구 될 것입니다 경우, case 문을 사용합니다. 그러나, 당신은 잠시 동안 주위에있을 수있다 생각하고, 항상 오렌지 / 사과 / 딸기 순서가 될 것 (또는하지 않을 경우 - 아래 참조), 당신은 몇 가지 속도를 얻기 위해 일부 디스크 공간을 희생에 대해 생각 할 수 있습니다.

    or_ap_st라는 테이블에 새 열을 만들고 과일 컬럼의 값에 따라 숫자 1, 2, 3, 그것을 채울 삽입 / 업데이트 트리거를 사용합니다. 거기에 그런 인덱스입니다.

    행 변경, 즉 그것을 할 수있는 가장 좋은 시간 때 유일한 시간 때문에 그 열 의지 변화의 데이터입니다. 비용은 다음 따라서 선택 문을 상각, 쓰기의 작은 숫자보다는 읽기의 많은 수에 발생됩니다.

    귀하의 질문은 눈부시게 빠른 될 것입니다 :

    select field1, field2 from table1
    order by or_ap_st;
    

    성능을 죽이는없이 당 행 기능.

    당신은뿐만 아니라 다른 정렬 순서를 원한다면, 음,의는 왜 열 or_ap_st을했다. 당신이 필요로하는 당신은 많은 다른 정렬 컬럼으로 추가 할 수 있습니다.

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

    4.내가 그 경우에 할 것은

    내가 그 경우에 할 것은

    ORDER BY
      CASE WHEN FRUIT = 'Orange' THEN 'A' 
           WHEN FRUIT = 'Apple' THEN 'B'
           WHEN FRUIT = 'Strawberry' THEN 'C'
           ELSE FRUIT
    END
    
  5. ==============================

    5.turtlepick의 대답에서 더 나아가 :

    turtlepick의 대답에서 더 나아가 :

    ORDER BY
      CASE WHEN FRUIT = 'Orange' THEN 'A' 
           WHEN FRUIT = 'Apple' THEN 'B'
           WHEN FRUIT = 'Strawberry' THEN 'C'
           ELSE FRUIT
      END
    

    경우 당신은 과일 몇 가지 더 많은 항목을 가지고 그런 다음 키워드, 해당 항목은 하드 코딩 된 순서 내에서 나타납니다 후 정의 문자로 시작하는 일. 예를 들어 바나나 딸기 전에 보여줍니다. 당신은 그것을 피할 수 있습니다

    ORDER BY
      CASE
        WHEN FRUIT = 'Orange' THEN '.1'
        WHEN FRUIT = 'Apple' THEN '.2'
        WHEN FRUIT = 'Strawberry' THEN '.3'
        ELSE FRUIT
      END
    

    여기에 나는 그들이 과일의 값의 시작 부분에 나타나지 않을 것이라는 희망 낮은 ASCII 값으로 사용되는 문자가 있습니다.

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

    6.테이블에 키를 추가합니다 (예를 들어, fruit_id INT 신원 (1,1) 기본 키) 삽입의 순서를 유지하기

    테이블에 키를 추가합니다 (예를 들어, fruit_id INT 신원 (1,1) 기본 키) 삽입의 순서를 유지하기

    create table fruit(fruit_id int identity(1,1) primary key, name varchar(50))
    go
    
    insert into fruit(name) values ('orange')
    insert into fruit(name) values ('apple')
    insert into fruit(name) values ('strawberry')
    
    select name from fruit
    

    결과:

    orange
    apple
    strawberry
    
  7. from https://stackoverflow.com/questions/4789241/tsql-is-it-possible-to-define-the-sort-order by cc-by-sa and MIT license