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
'programing' 카테고리의 다른 글
텍스트 필드를 선택할 때 UITableView 스크롤 만들기 (0) | 2023.05.18 |
---|---|
유형 오류: 'dict_keys' 개체가 인덱싱을 지원하지 않습니다. (0) | 2023.05.18 |
vb.net 에서 메서드 이름 뒤에 있는 달러 기호의 의미는 무엇입니까? (0) | 2023.05.18 |
Visual Studio가 "솔루션을 닫기 전에 빌드를 중지해야 합니다" 상태로 고착됨 (0) | 2023.05.18 |
Mongoose 자동 증분 (0) | 2023.05.18 |