맞춤 주문 설명
나는 이것을 얼마 전에 발견했고 그 이후로 사용 해왔다. 그러나 오늘 그것을 보면 왜 그것이 작동하는지 완전히 이해하지 못한다는 것을 깨달았습니다. 누군가 나를 위해 빛을 비출 수 있습니까?
ORDER BY s.type!= 'Nails',
s.type!= 'Bolts',
s.type!= 'Washers',
s.type!= 'Screws',
s.type!= 'Staples',
s.type!= 'Nuts', ...
s.type으로 주문하면 알파벳순으로 정렬됩니다. 위의 예를 사용하면 라인 위치와 동일한 순서를 사용합니다. 내가 이해하지 못하는 것은! =의 사용입니다. =를 사용하면 반대 순서로 나타납니다. 나는 이것의 개념에 내 머리를 감쌀 수 없습니다.
위의! = 대신 =를 사용하면 Nails가 첫 번째 위치에 배치되지만 그렇지 않고 마지막에 배치됩니다. 내 질문은 이것이 있다고 생각합니다 : 왜이 상황에서 =가 아니라! =를 사용해야합니까?
본 적이 없지만 말이되는 것 같습니다.
처음에는 s.type != 'Nails'
. 이것은 열에 false
포함 Nails
된 모든 행 에 적용 type
됩니다. 그 후로 정렬됩니다 Bolts
. 다시 포함하는 모든 열에 Bolts
대해 type
this는 false로 평가됩니다. 등등.
작은 시험은 계시 false
전에 주문한다 true
. 다음이 그래서 첫째 당신은 모든 행을 얻을 Nails
(가)있어서 때문에 위에 ORDER BY
로 평가 false
하고 false
먼저 다. 나머지 행은 두 번째 ORDER BY
기준에 따라 정렬됩니다 . 등등.
유형 | ! = 손톱 | ! = 볼트 | ! = 와셔 '손톱'| 거짓 | 사실 | 진실 '볼트'| 사실 | 거짓 | 진실 '와셔'| 사실 | 사실 | 그릇된
각 표현식은 부울로 평가되고 거짓 인 경우 0으로, 참인 경우 1로 처리되고 적절하게 정렬됩니다. 이것이 작동하더라도 논리를 따르기 (따라서 유지하기는 어렵습니다). 내가 사용하는 것은 배열에서 값의 인덱스를 찾는 함수입니다.
ORDER BY idx(array['Nails','Bolts','Washers','Screws','Staples','Nuts'], s.type)
따라 가기가 훨씬 쉽습니다. 손톱이 먼저 정렬되고 견과류가 마지막에 정렬됩니다. Postgres 스 니펫 저장소에서 idx 함수를 만드는 방법을 볼 수 있습니다. http://wiki.postgresql.org/wiki/Array_Index
@Scott Bailey 가 좋은 아이디어를 제안했습니다. 그러나 PostgreSQL 9.5 이후로 더 간단 할 수 있습니다 (사용자 지정 함수를 만들 필요가 없음). 그냥 사용 array_position
기능 :
ORDER BY array_position(array['Nails','Bolts','Washers','Screws','Staples','Nuts'], s.type)
array_position을 사용하려면 쿼리하는 것과 동일한 유형을 가져야합니다.
예 :
select array_position(array['foo'::char,'bar','baz'::char], 'bar');
select array_position(array['foo'::char,'bar','baz'::char], 'baz'::char);
참조 URL : https://stackoverflow.com/questions/4088532/custom-order-by-explanation
'programing' 카테고리의 다른 글
쉘에서 .bashrc에 정의 된 함수를 어떻게 호출합니까? (0) | 2021.01.17 |
---|---|
해시 인수를 사용한 DRY Ruby 초기화 (0) | 2021.01.17 |
Django-AttributeError 'User'객체에는 'backend'속성이 없습니다 (하지만… (0) | 2021.01.17 |
SDK 도구, 버전 12에서 Android 에뮬레이터 시작 (0) | 2021.01.17 |
RequiredIf 조건부 유효성 검사 속성 (0) | 2021.01.17 |