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
CASE
및 ORDER 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
'ProgramingTip' 카테고리의 다른 글
ToString () 전에 null 확인 (0) | 2020.10.20 |
---|---|
@Html 도우미가 생성하는 동안 MVC에서 'data-val-number'유효성 검사를 변경하는 방법 (0) | 2020.10.20 |
getIntent () Extras 항상 NULL (0) | 2020.10.20 |
일부 사람들에게만 "네이티브 서체를 만들 수 없습니다" (0) | 2020.10.20 |
javadoc을 private 필드에 연결하는 방법은 무엇입니까? (0) | 2020.10.19 |