2016-11-15 12 views
1

SQL 테이블 주문에 대한 질문이 있습니다. 이미 여러 가지를 시도했지만 원하는 솔루션을 찾을 수 없습니다. 다음과 같이SQL 테이블 ORDER BY (아래쪽 빈 필드)

내 테이블 보이는 : 나는 차일 + 애완 동물 (오름차순)으로 내 테이블을 주문하려는

username childs+pets childs pets 
======================================= 
Max  1      1 
Nico  3   1   2  
Lewis  2   2   
Daniel 2   1   1 

,하지만 난의 맨 아래에 빈 필드가있는 레코드 (최대 루이스)을 데려 가고 싶다는 탁자. 어떤 결과 :

username childs+pets childs pets 
======================================= 
Nico  3   1   2 
Daniel 2   1   1  
Lewis  2   2   
Max  1      1 

누가 나를 도울 수 있습니까?

+0

빈 필드라고 말하면 NULL이라는 뜻입니까? (또는 길이가 0 인 문자열 ...) – jarlh

+0

사용중인 dbms에 태그를 지정하십시오. 대답은 특정 제품 기능을 사용할 수 있습니다. – jarlh

+0

길이가 0 인 문자열. 그리고 dmbs는 MariaDB입니다. – Maarten

답변

0

SQL Server에서 작동하는 솔루션입니다. Childs + Pets는 두 개의 개별 필드에서 계산 된 필드라고 가정했습니다.

테스트 데이터; 아무것도 Childs 또는 Pets 중 하나에 NULL 값이있는 경우 다음이 바닥에 밀어 넣을 수 있도록

CREATE TABLE #TestData (Username nvarchar(10), Childs int, Pets int) 
INSERT INTO #TestData (Username, Childs, Pets) 
VALUES 
('Max',NULL,1) 
,('Nico', 1,2) 
,('Lewis',2,NULL) 
,('Daniel',1,1) 

쿼리

SELECT 
    td.Username 
    ,COALESCE(td.Childs,0) + COALESCE(td.Pets,0) Childs_Pets --The coalesce returns a Zero if the field contains a NULL 
    ,td.Childs 
    ,td.Pets 
FROM #TestData td 
ORDER BY CASE WHEN td.Childs IS NULL OR td.Pets IS NULL THEN 0 ELSE 1 END DESC 
,COALESCE(td.Childs,0) + COALESCE(td.Pets,0) ASC 

출력

Username Childs_Pets  Childs  Pets 
Daniel  2    1   1 
Nico  3    1   2 
Max   1    NULL  1 
Lewis  2    2   NULL 

CASE 문은 첫번째 주문됩니다. Childs_Pets의 주문은 이후에 제공되며 원하는대로 ASC을 정렬합니다.

+0

도움 주셔서 감사합니다. 나는 빈 필드를 NULL로 변경했고 이것이 작동한다. – Maarten

0

이 샘플은 충분히 명확하지, 그래서 두 가지 중 하나를 선택 : 그냥

select  * 

from  t 

order by "childs+pets" + 0 desc 
      ,case when childs = '' then 2 else 1 end 
      ,case when pets = '' then 2 else 1 end 
;   

select  * 

from  t 

order by case when childs = '' then 2 else 1 end 
      ,case when pets = '' then 2 else 1 end 
      ,"childs+pets" + 0 desc 
;   
+0

도움을 주셔서 감사합니다. – Maarten

0

가장 간단한 솔루션 (NULL 값에 대한 작업을) :

select * 
from mytable 
order by coalesce(childs+pets, 9999) 

또는 빈 값이 0 문자열이라고 말하면 다음을 사용할 수도 있습니다.

select * 
from mytable 
order by case when childs = '' or pets = '' then '9999' else childs+pets end 
+0

DBMS가 지정되지 않은 제품에 대한 제품 별 답변입니다. 최소한 OP와 나머지 dbms에게 알려주십시오. – jarlh

+1

맞습니다. coalesce 함수의 isnull 함수를 변경했습니다. 이제 이것은 ANSI SQL 92의 평범한 함수이며 모든 dbms에서 작동해야합니다. –

+0

OP 요청 결과를 반환하지 않을 수도 있습니다. –