ProgramingTip

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

bestdevel 2020. 10. 20. 07:53
반응형

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


좋아, 색인이 생성 된 키와 색인이 생성되지 않은 필드가있는 테이블이 있습니다. 특정 값을 가진 모든 레코드를 찾고 행을 반환해야합니다. 여러 값으로 주문할 수 있는지 알고 싶습니다.

예 :

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

pseudo : 결과가 다음과 같이 정렬되기를 원합니다. where 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

구문은 유효하지만 쿼리를 실행하면 레코드를 1 개로 제한하더라도 결과가 반환되지 않습니다. 이것에 대해 다른 방법이 있습니까?

x_field를 테스트 결과로 조건에 해당하는 모든 레코드의 유효성을 검사해야합니다. 실패한 값, 통과 한 값으로 테스트 결과를 정렬하고 싶었습니다. 실패한 값을 먼저 확인한 다음 ORDER BY를 사용하여 전달 된 값을 확인할 수 있습니다.

내가 할 수없는 것 :

  • 특정 레코드 값을 반환해야 GROUP BY
  • WHERE x_field IN ( 'f', 'p', 'i', 'a'), 여러 유효성 검사 테스트에 하나의 쿼리를 사용하려는 모든 값이 필요합니다. x_field 값은 DESC / ASC 순서가 아닙니다.

이 질문을 쓴 후 나는 다시 생각할 필요가 있다고 생각하기 시작했습니다, LOL!


...
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

LEFT JOIN을 "VALUES ( 'f', 1), ( 'p', 2), ( 'a', 3), ( 'i', 4)"와 사용하고 주문에서 두 번째 열을 함께 사용할 수 있습니다. . -표현으로. Postgres는 값이 많은 경우 거대한 CASE보다 훨씬 빠른 해시 조인을 사용합니다. 그리고 자동 생성이 더 있습니다.

이 주문 정보가 고정 된 경우 자체 테이블이 있어야합니다.


시험 :

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

올바른 길을 가고 있었지만 x_field를 F 값에만두면 나머지 3 개는 상수로 취급되고 데이터 세트의 어떤 것과도 비교되지 않은 것입니다.


case스위치를 사용 하여 코드를 정렬 할 수있는 숫자로 변환합니다.

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

CASEORDER BY제안은 모든 일을해야한다,하지만 난 다른 색의 말을 제안하겠습니다. 적절한 수의 값만 x_field있고 이미 그 값을 알고 있다고 가정하고 F, P, A 및 I를 값으로 사용하여 열거 형만듭니다 (다른 가능한 값이 적용됨). 열거 형은 CREATE문에 암시 된 순서대로 정렬됩니다 . 또한 서수 위치 만 저장되기 때문에 공간을 낭비하지 않고 의미있는 값 이름을 사용할 수 있습니다. 실제 응용 프로그램에서 사용할 수 있으며 기밀성을 위해 마스크를 마스킹했습니다.


이에 대한 훨씬 더 깨끗한 해결책을 찾았습니다.

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

참고 : array_position에는 Postgres v9.5 이상이 필요합니다.


선택한 열 또는 다른 표현식을 기준으로 정렬 할 수 있습니다.

다음은 case-statement의 결과를 기준으로 주문하는 방법의 예입니다.

  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 = 0"행으로 시작하여 "IsGen = 1"행과 끝이 다른 모든 행으로 시작하는 목록이됩니다.

끝에 주문 매개 변수를 더 추가 할 수 있습니다.

  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

순서를 정렬하기 위해 위치 (텍스트의 텍스트)를 사용할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/6332043/sql-order-by-multiple-values-in-specific-order

반응형