programing

맞춤 주문 설명

yoursource 2021. 1. 17. 12:23
반응형

맞춤 주문 설명


나는 이것을 얼마 전에 발견했고 그 이후로 사용 해왔다. 그러나 오늘 그것을 보면 왜 그것이 작동하는지 완전히 이해하지 못한다는 것을 깨달았습니다. 누군가 나를 위해 빛을 비출 수 있습니까?

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대해 typethis는 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

반응형