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
좋은데 작동 date및 time열도! (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.