2008-09-29 2 views
48

나는 MySQL 데이터베이스에 많은 작업을 가지고 있으며 필드 중 하나는 "데드 라인 날짜"입니다. 모든 작업이 기한 마감 날짜를 가져야하는 것은 아닙니다.SQL을 사용하여 날짜별로 정렬 할 수 있지만 결과 집합의 뒤에 null 날짜를 넣을 수 있습니까?

나는 SQL을 사용하여 마감일을 기준으로 작업을 정렬하지만 결과 집합의 끝 부분에 최종 기한이없는 날짜를 넣고 싶습니다. 지금은 null 날짜가 먼저 표시되고 나머지 날짜는 가장 늦은 날짜부터 가장 늦은 날짜까지 정렬됩니다.

SQL을 사용하여이 작업을 수행하는 방법에 대한 아이디어가 있으십니까? (필요한 경우 PHP로 처리 할 수 ​​있지만 SQL 전용 솔루션은 훌륭합니다.)

고마워!

답변

62

후 기한 후, 앞에 종류의 모든 비 - 널 (null)을두고(). 이 함수는 표준 SQL이 아니며 다른 RDBMS 브랜드에서는 작동하지 않을 수 있습니다.

SELECT * FROM myTable 
WHERE ... 
ORDER BY CASE WHEN myDate IS NULL THEN 1 ELSE 0 END, myDate; 
+0

+1. 다음은 우아하고 컴팩트 한 표준 솔루션입니다 ([SQL : 2003 extension T611] (http://en.wikipedia.org/wiki/Order_by)부터 사용 가능하지만 모든 벤더가이 기능을 구현하지는 않습니다) : http://stackoverflow.com/ a/12767777/814702. – informatik01

+1

@ informatik01, 좋은 팁이지만,이 질문은 mysql 태그가 붙고 MySQL은 그 구문을 지원하지 않습니다. –

+0

@BillKarwin 그래, 슬픈. PostgreSQL 9.1에서만이 기능을 확인했습니다. 어쨌든,이 정보를 완전성을 위해 여기에 두십시오. 추신 그냥'ORDER BY'를 사용할 때 MySQL과 PostgreSQL이 다르게 동작한다는 사실에 주목했습니다. * 오름차순을 주문할 때 * MySQL은 NULL 값을 ** 처음에는 ** 넣고, PostgreSQL은 NULL 값을 ** 마지막으로 ** 넣습니다. 음, 공급 업체 특정 물건 ... – informatik01

4
SELECT foo, bar, due_date FROM tablename 
ORDER BY CASE ISNULL(due_date, 0) 
WHEN 0 THEN 1 ELSE 0 END, due_date 

그래서 두 번째 by by clauses가 있습니다. 첫 번째는 여기에만 표준 SQL을 사용하여 솔루션 ISNULL하지의 그

+0

"case isnull (due_date, 0) 0 일 때 1 then else 0"- 모든 것을 수행하는 이유는 무엇입니까? 어쨌든 isnull은 1 또는 0을 반환합니다. – nickf

+0

MSSQL에서 ISNULL은 첫 번째 인수 또는 첫 번째 인수가 null 인 경우 두 번째 인수를 반환합니다. 같은 것을 수행하고 두 개 이상의 인수를 허용하는 표준 SQL 함수 COALESCE가 있습니다. 그러나 이것은 포스터가 MySQL에 대해 묻기 때문에 조금 벗어난 주제입니다 .... – Stewart

28
SELECT * FROM myTable 
WHERE ... 
ORDER BY ISNULL(myDate), myDate 
+0

ISNULL은 SQL Server에 2 개의 인수가 필요합니다. MySQL은 하나만 필요합니까? – Codewerks

+3

예 - 단지 하나. http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_isnull – nickf

+0

Access/VBA의 경우 'True

관련 문제