MySQL Orderby 숫자, Nulls 마지막


280

현재 저는 진술서에서 매우 기본적인 OrderBy를하고 있습니다.

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC

이것의 문제점은 'position'에 대한 NULL 항목이 0으로 취급된다는 것입니다. 따라서 position이 NULL 인 모든 항목은 1,2,3,4가있는 항목 앞에 나타납니다. 예 :

NULL, NULL, NULL, 1, 2, 3, 4

다음 순서를 달성 할 수있는 방법이 있습니까?

1, 2, 3, 4, NULL, NULL, NULL.

8
user1052645의 답변을 다시 고려해야합니다. 더 간단하고 최대 값에 대한 지식이 필요하지 않으며 더 빠를 수 있습니다 (표현식 평가가 함수 호출보다 빠르다고 가정).
Steve Clay

답변:


567

MySQL에는 문서화되지 않은 구문이있어 널을 마지막으로 정렬합니다. 열 이름 앞에 빼기 부호 (-)를 놓고 ASC를 DESC로 전환하십시오.

SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC

본질적으로 position DESCNULL 값을 마지막 에 배치하는 것과 반대 이지만 그렇지 않으면와 동일합니다 position ASC.

좋은 참조는 여기 http://troels.arvin.dk/db/rdbms#select-order_by


79
문서화되지 않았 으며 ORDER BY 절이 허용 - col_name하는 표현식 ( 0 - col_name)입니다. 물론 이것은 숫자 열에서만 작동합니다.
Steve Clay

7
좋은데 작동 datetime열도! (MySQL 5.5). 나는 그것이 모든 숫자와 같은 열 (타임 스탬프, 플로트 ...)에 대해 작동한다고 생각한다.
마틴

6
@koral : 순서를 바꾸는 단순하고 유용한 수학 식으로 언어 자체가 크게 바뀌지 않는 한 제거되지 않습니다.
Bell

11
의견에서 알 수 있듯이 숫자, 날짜 및 시간 열에 작동합니까? 그러나 varchar는 어떻습니까? varchar에도 적용 할 수 있습니까? varchar 필드에 적용하려고 시도했지만 순서는 ASC 또는 DESC를 사용하는 것과 다릅니다.
Sumit Desai

9
이렇게하면 열순으로 가능한 색인을 사용할 수 있습니까?
Tarsis

305

나는 이것이 대부분 좋은 해결책이라는 것을 알았다.

SELECT * FROM table ORDER BY ISNULL(field), field ASC;

6
작품으로 재정의 명령을 정의하지 않고 : SELECT * FROM table ORDER BY ISNULL(field) ASC;(MySQL 5.5)
Marçal Juan

5
이것이 더 나은 솔루션입니다.
Rok Kralj

4
수락 된 솔루션은 postgresql 9.3의 TIMESTAMP에서 작동하지 않습니다. 이 솔루션은 ...
kalu

2
짜증나게도, MySQL은 isnull (field)을 order by 절에 추가 할 때 필드에 인덱스를 사용하지 않습니다 (한도 사용시).
Barry Kelly

3
@kalu :에서 의 PostgreSQL , NULL 값이 정렬 마지막 승순 (먼저 내림차순). 표준 SQL 절을NULLS LASTNULLS FIRST 사용하는 것이 좋습니다. | 여기서 해결 방법 대신 뒤집으십시오.
Erwin Brandstetter

23

같은 것

SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC

999999999를 필드의 최대 값으로 바꾸십시오.


3
이 솔루션은 허약하고 간헐적 인 버그로 이어질 수
드미트리 보그

20

마지막 NULL

SELECT * FROM table_name ORDER BY id IS NULL, id ASC

4

NULL 인스턴스를 다른 값으로 바꿔서 먼저 (0 또는 -1과 같이) 또는 마지막으로 (큰 숫자 나 문자) 정렬 할 수 있습니다.

SELECT field1, IF(field2 IS NULL, 9999, field2) as ordered_field2
  FROM tablename
 WHERE visible = 1
 ORDER BY ordered_field2 ASC, id DESC

ORDER BY에서 참조 된 인덱스는 SELECT 문의 값을 바꾸어도 영향을받지 않으므로 순서를 수정하지 않으므로 문제가 해결되지 않습니다. 또한 COALESCE 기능을 확인하십시오. 이는 기능적으로 IF 기능을 사용하는 것과 같습니다.
정의

IF 문의 별칭을 적절하게 지정하면 예상대로 행이 정렬됩니다. 나는 나의 모범을 고쳤다.
Langdon

4

이 쿼리를 사용해보십시오.

SELECT * FROM tablename
WHERE visible=1 
ORDER BY 
CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC

케이스가 필요 없습니다. IS NULL은 expression이 NULL 인 경우 1을 반환합니다. 잔향의 답변을 참조하십시오.
contactmatt

3

명령문 에서 NULL을 통합 할 수 있습니다 ORDER BY.

select * from tablename
where <conditions>
order by
    coalesce(position, 0) ASC, 
    id DESC

NULL을 맨 아래에서 정렬하려면을 시도하십시오 coalesce(position, 100000). (두 번째 숫자를 positiondb 의 다른 숫자보다 크게 만드십시오 .)


3
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC

6
OP는 왜 이것을 시도해야 합니까? 좋은 답변 은 항상 OP에 대한 것뿐만 아니라 향후 SO를 방문한 사람들에게이 질문을 찾아 답변을 읽을 수있는 방법과 그 방법에 대한 설명을 제공합니다.
RiggsFolly

2

A의 DATE열 당신은 사용할 수 있습니다 :


마지막 NULL :

ORDER BY IFNULL(`myDate`, '9999-12-31') ASC

마지막 공백 :

ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC

1

다음과 같은 결과를 얻으려면 :

1, 2, 3, 4, NULL, NULL, NULL.

USE 구문, -(minus sign)필드 이름 앞에 놓고 inverse order_type을 사용하십시오 (처럼 : ASC 순서로 주문하려면 DESC를 사용하거나 DESC 순서를 원하면 ASC를 사용하십시오)

SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC


1

이것은 잘 작동합니다 :

SELECT * FROM tablename ORDER BY position = 0, position ASC;

position
1 
2
3
0
0

-8

NULLS LAST로 주문하지 않는 이유는 무엇입니까?

SELECT * 
FROM tablename
WHERE visible = 1 
ORDER BY position ASC NULLS LAST, id DESC 

NULLS LAST-어떤 버전의 MySQL이 도입 되었습니까?
crmpicco

2
@Panique, 당신은 (MS) SQL Server를 의미합니까?
d -_- b

1
이 답변은 MySQL에 적용되지 않습니다
PeppyHeppy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.