programing

sql 여러 값을 특정 순서로 정렬하시겠습니까?

padding 2023. 5. 18. 20:48
반응형

sql 여러 값을 특정 순서로 정렬하시겠습니까?

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

예:

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

유사: 결과가 다음과 같이 정렬되기를 원합니다.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, 특정 레코드 값을 반환해야 하므로
  • 여기서 x_field IN('f', 'p', 'i', 'a'), 여러 검증 테스트에 하나의 쿼리를 사용하려고 하므로 모든 값이 필요합니다.그리고 x_field 값이 DESC/ASC 순서가 아닙니다.

이 질문을 쓰고 나니 다시 생각해봐야겠다는 생각이 들기 시작했어요, ㅋㅋㅋ!

...
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 -- fallback for values not inside the IN clause. eg : x_field = 'b'
   END, id

시도:

ORDER BY x_field='f', x_field='p', x_field='i', x_field='a'

올바른 경로에 있었지만 x_field'f' 값에만 배치함으로써 나머지 세 개는 상수로 처리되고 데이터 세트의 어떤 것과도 비교되지 않았습니다.

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

이 주문 정보가 고정되어 있으면 자체 테이블이 있어야 합니다.

이에 대한 훨씬 더 깨끗한 솔루션을 찾았습니다.

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

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

사용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

CASE그리고.ORDER BY제안은 모두 효과가 있어야 하지만, 저는 다른 색깔의 말을 제안할 것입니다.다음에 대한 적절한 수의 값만 있다고 가정합니다.x_field그리고 이미 알고 있는 값은 F, P, A 및 I를 값으로 하는 열거형을 만듭니다(그리고 다른 가능한 값이 적용되는 경우).열거형은 포함된 순서대로 정렬됩니다.CREATE에 공간 없이 에서 기밀성을할 수 .또한, 서수 위치만 저장되므로 공간 낭비 없이 실제 애플리케이션에서 기밀성을 위해 마스킹한 값 이름을 사용할 수 있습니다.

CASE와 함께 주문하는 것이 처음인 사람에게는 이것이 유용할 수 있습니다.

ORDER BY 
    CASE WHEN GRADE = 'A' THEN 0
         WHEN GRADE = 'B' THEN 1
         ELSE 2 END

@bobflux의 대답은 훌륭합니다.제안된 접근 방식을 사용하는 완전한 쿼리를 추가하여 확장하고 싶습니다.

select tt.id, tt.x_field
from target_table as tt
-- Here we join our target_table with order_table to specify custom ordering.
left join
    (values ('f', 1), ('p', 2), ('i', 3), ('a', 4)) as order_table (x_field, order_num)
    on order_table.x_field = tt.x_field
order by
    order_table.order_num, -- Here we order values by our custom order.
    tt.x_field;            -- Other values can be ordered alphabetically, for example.

여기 완전한 데모가 있습니다.

저는 댓글로 쓸 만큼의 명성이 없기 때문에, 이것을 새로운 답변으로 추가했습니다.

절별 주문에 scordescript를 추가할 수 있습니다.

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

내가 먼저, P 두 번째와 A를 마지막으로, F를 마지막으로 만듭니다.

4에는 MySQL 4.0을 사용하는 것을 하십시오.FIELD()다음 인수를 통해 첫 번째 인수의 인덱스 위치를 반환하며 대소문자를 구분합니다.

ORDER BY FIELD(x_field, 'f', 'p', 'i', 'a')

선택한 열 또는 다른 식으로 정렬할 수 있습니다.

다음은 사례 설명의 결과에 따라 주문하는 방법의 예입니다.

  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

반응형