복붙노트

[SQL] 특정 순서로 여러 값 BY SQL ORDER?

SQL

특정 순서로 여러 값 BY SQL ORDER?

좋아 나는 인덱스 키와 비 인덱스 필드가있는 테이블이있다. 나는 특정 값으로 모든 레코드를 찾을 필요하고 행을 반환합니다. 나는 여러 값으로 주문할 수 있는지 알고 싶습니다.

예:

id     x_field
--     -----
123    a
124    a
125    a
126    b
127    f
128    b
129    a
130    x
131    x
132    b
133    p
134    p
135    i

의사 : 결과를 원하는가 다음과 같이 주문해야 여기서 ORDER BY x_field = 'F', 'P', 'I', 'A'

SELECT *
FROM table
WHERE id NOT IN (126)
ORDER BY x_field 'f', 'p', 'i', 'a'

그래서에게 그 결과는 다음과 같습니다

id     x_field
--     -----
127    f
133    p
134    p
135    i
123    a
124    a
125    a
129    a

구문은 유효하지만 쿼리를 실행할 때 내가 한 기록으로 제한하는 경우에도, 어떤 결과를 반환하지 않습니다. 이것에 대해 갈 수있는 또 다른 방법이 있습니까?

테스트 결과로 x_field 생각 나는 상태에 빠지게 모든 레코드를 확인해야합니다. 나는 실패 값을 기준으로 테스트 결과를 주문하고 싶었다 값을 통과시켰다. 내가 먼저 다음 BY 순서를 사용하여 전달 된 값을 실패한 값을 확인할 수 있도록.

내가 할 수없는 무엇 :

이 질문을 작성 후 나는 LOL이을 재고 할 필요가 있다고 생각하기 시작 해요!

해결법

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

    1.

    ...
    WHERE
       x_field IN ('f', 'p', 'i', 'a') ...
    ORDER BY
       CASE x_field
          WHEN 'f' THEN 1
          WHEN 'p' THEN 2
          WHEN 'i' THEN 3
          WHEN 'a' THEN 4
          ELSE 5 --needed only is no IN clause above. eg when = 'b'
       END, id
    
  2. ==============================

    2.넌 "VALUES ( 'F', 1, 'P', 2), ( 'A', 3), ( 'I'는, 4)"를이 순서로 두 번째 열을 이용하여 조인 LEFT를 사용 에 의하여 - 식입니다. 해시를 사용합니다 포스트 그레스는 값의 많은 경우 훨씬 더 빨리 큰 CASE보다 것이다 가입. 그리고 그것은 자동 생성에 용이하다.

    넌 "VALUES ( 'F', 1, 'P', 2), ( 'A', 3), ( 'I'는, 4)"를이 순서로 두 번째 열을 이용하여 조인 LEFT를 사용 에 의하여 - 식입니다. 해시를 사용합니다 포스트 그레스는 값의 많은 경우 훨씬 더 빨리 큰 CASE보다 것이다 가입. 그리고 그것은 자동 생성에 용이하다.

    이 주문 정보가 고정되어있는 경우, 그것은 자신의 테이블이 있어야합니다.

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

    3.시험:

    시험:

    ORDER BY x_field='F', x_field='P', x_field='A', x_field='I'
    

    당신이 바로 그 궤도에 있었다,하지만 F 값에 x_field을 넣어, 다른 셋은 데이터 세트에서 아무것도 비교 상수로 취급되지 않았다.

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

    4.정렬 할 수있는 숫자로 코드를 변환하는 경우 스위치를 사용 :

    정렬 할 수있는 숫자로 코드를 변환하는 경우 스위치를 사용 :

    ORDER BY
      case x_field
      when 'f' then 1
      when 'p' then 2
      when 'i' then 3
      when 'a' then 4
      else 5
      end
    
  5. ==============================

    5.나는 이것에 대한 많은 청소기 솔루션을 발견 :

    나는 이것에 대한 많은 청소기 솔루션을 발견 :

    ORDER BY array_position(ARRAY['f', 'p', 'i', 'a']::varchar[], x_field)
    

    참고 : array_position은 포스트 그레스 V9.5 이상이 필요합니다.

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

    6.제안 BY 케이스와 ORDER은,하지만 난 다른 색의 말을 제안 모든 작업려고한다. 이 x_field 값의 합당한 수 있습니다 당신은 이미 그들이 무엇인지 알고 있다고 가정하면, (다른 가능한 값이 적용됩니다 어떤 플러스) 값으로 F, P, A, 내가 가진 열거 형을 만들 수 있습니다. 열거 형은 CREATE 문에 의해 묵시적 순서로 정렬합니다. 또한, 당신은 아마 meaninful 값 이름 - 실제 응용 프로그램을 사용하지 만 서수 위치가 저장되어 있기 때문에 당신은 단지, 비밀-없이 낭비되는 공간을 마스크 할 수 있습니다.

    제안 BY 케이스와 ORDER은,하지만 난 다른 색의 말을 제안 모든 작업려고한다. 이 x_field 값의 합당한 수 있습니다 당신은 이미 그들이 무엇인지 알고 있다고 가정하면, (다른 가능한 값이 적용됩니다 어떤 플러스) 값으로 F, P, A, 내가 가진 열거 형을 만들 수 있습니다. 열거 형은 CREATE 문에 의해 묵시적 순서로 정렬합니다. 또한, 당신은 아마 meaninful 값 이름 - 실제 응용 프로그램을 사용하지 만 서수 위치가 저장되어 있기 때문에 당신은 단지, 비밀-없이 낭비되는 공간을 마스크 할 수 있습니다.

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

    7.당신은 선택한 열 또는 다른 식으로 주문할 수 있습니다.

    당신은 선택한 열 또는 다른 식으로 주문할 수 있습니다.

    여기에 예를 들어, 어떻게 대소 문의 결과에 의해 주문하기 :

      SELECT col1
           , col2
        FROM tbl_Bill
       WHERE col1 = 0
    ORDER BY -- order by case-statement
        CASE WHEN tbl_Bill.IsGen = 0 THEN 0
             WHEN tbl_Bill.IsGen = 1 THEN 1
             ELSE 2 END
    

    그 결과 "IsGen = 1"행 및 다른 열의 상기 일단 뒤에 "IsGen = 0"행에서 시작하는 것이다.

    당신은 마지막에 더 주문 매개 변수를 추가 할 수 있습니다 :

      SELECT col1
           , col2
        FROM tbl_Bill
       WHERE col1 = 0
    ORDER BY -- order by case-statement
        CASE WHEN tbl_Bill.IsGen = 0 THEN 0
             WHEN tbl_Bill.IsGen = 1 THEN 1
             ELSE 2 END,
             col1,
             col2
    
  8. ==============================

    8.당신은 순서를 주문하는 순서대로 위치 (텍스트의 텍스트)를 사용할 수 있습니다

    당신은 순서를 주문하는 순서대로 위치 (텍스트의 텍스트)를 사용할 수 있습니다

  9. from https://stackoverflow.com/questions/6332043/sql-order-by-multiple-values-in-specific-order by cc-by-sa and MIT license