2012-02-15 1 views
2

두 열의 숫자를 기준으로 정렬 할 테이블이 있습니다 (열 X와 열 Y라고 함). 각 행에서 두 열은 숫자 값 (이 경우 X < = Y)을 갖거나 열 중 하나가 NULL 일 수 있습니다.SQL : 두 개의 열의 인터레이스 된 값을 기반으로 한 ORDER BY

예 데이터 : 열이 "제대로"인터리브 있도록

 X  Y 
    ----- ----- 
... NULL 26 
... 31 NULL 
... 1  7 
... 39 46 
... NULL 36 
... 15 16 
... NULL 14 
... 23 29 

나는이 데이터를 정렬하고 싶습니다. 구체적으로는 다음 Y 값은 두 개의 행에 존재하는 경우, X 값은 두 행에 있으면

1) 순서 X.에 기초

2) 그렇지, 순서

Y.

에 기초 3) 그렇지 않으면 사용 가능한 X 값과 사용 가능한 Y 값을 비교합니다.

예제 데이터의 "올바른"정렬은 다음과 같습니다

 X  Y 
    ----- ----- 
... 1  7 
... NULL 14 
... 15 16 
... NULL 26 
... 23 29 
... 31 NULL 
... NULL 36 
... 39 46 

이 정렬을 수행 할 수있는 간단한 방법은 ORDER BY 절에 있나요?

+1

어디에서'... 25 NULL'을 (를) 배치 하시겠습니까? –

+0

그것은 23/29와 31/NULL 사이가 될 것입니다. 두 행에 모두 채워진 경우 X 열을 기준으로 정렬하는 것이 우선 순위가됩니다. 명확하게하기 : 목표는 두 열의 값이 해당 열의 다른 값과 관련하여 정렬되도록하는 것입니다. 분명한 이유는 X 열에서 항상 가능하며 일반적으로 Y 열에서 "닫기"를 얻을 수 있습니다 - 25/27 고려하십시오. 비록 Y 칼럼에서 약간의 오더 오더링이 발생하더라도 23/29 이후에야 만 할 것입니다. – VeeArr

답변

5

수 없습니다. 순서는 잘

5 10 
7 null 
null 8 

는 당신이 정렬 시작 위치에 따라

5 10 
7 null 
null 8 

null 8 
5 10 
7 null 

을 정렬 할 수 있습니다 간단한 세트 정의되어 있지 않습니다.

가능한 경우 정렬 기준을 "X (가능하다면), 그렇지 않으면 Y"으로 변경합니다. 그런 다음 "mu is too short"로 제안 된대로 COALSECE 연산자를 사용할 수 있습니다. (order by coalesce(x, y))

+1

그래, 최종 순서는 어떤 행이 다른 행과 비교되는지에 따라 달라 지므로 전체 집합의 특성이 아니며 "정렬"프로세스의 아티팩트입니다. 좋은 카운터 예. –

+0

나는 그것이 두려웠다. 정렬 작업을 전 이적으로 만드는 합리적인 방법에 대한 제안을 할 수 있습니까? 예를 들어, 시연했듯이 특정 데이터 세트에 대해 둘 이상의 "올바른"정렬을 선택할 수 있습니다. 어느 쪽이든 나의 목적을 위해 동등하게 유효하다 (그러나 첫번째는 나가하고 싶은 무슨을의 정신에서이다). 입력 순서에 관계없이 동일한 출력을 제공하도록 "정렬 규칙"을 수정하는 방법이 있습니까? – VeeArr

관련 문제