복붙노트

[SQL] 특별한 제외하고, 다른 모든 후에는 null 값을 정렬

SQL

특별한 제외하고, 다른 모든 후에는 null 값을 정렬

나는 옵션 주문 필드 항목의 PostgreSQL의 테이블이 있습니다 :

CREATE TABLE tasks (
  id     integer  PRIMARY KEY DEFAULT nextval('f_seq'),
  f_id   integer  REFERENCES fixins,
  name   text     NOT NULL,
  sort   integer
);

나는 한 가지 예외 다른 모든 후 종류에 어떤 종류의 값을이없는 작업을합니다 : 만약 종류 = -1 내가 그 이후에 정렬합니다. 따라서, 예를 들어,이 값을 제공 :

id | f_id |   name   | sort
---+------+----------+-------
 1 |    1 | zeta     |    -1
 2 |    1 | alpha    |     1
 3 |    1 | gamma    |     3
 4 |    1 | beta     |     2
 5 |    1 | delta    |     
 6 |    1 | epsilon  |     

알파, 베타, 감마, 델타, 엡실론, 제타 : 나는 그들과 같이 정렬합니다.

내가 아닌 널 (null) 이후 주문 널 (null) 값으로 ORDER BY COALESCE을 (종류, 99999)를 사용할 수 있다는 것을 알고 있지만, 어떻게 그 후에 와서 특별한 -1 값을받을 수 있나요?

해결법

  1. ==============================

    1.간단한 :

    간단한 :

    SELECT *
    FROM   tasks
    ORDER  BY (sort IS NOT DISTINCT FROM -1), sort;
    

    포스트 그레스 (다른 RDBMS는 달리) 적절한 부울 유형이 있습니다. 당신은 다른 데이터 유형으로처럼으로 주문할 수 있습니다. 그리고 그것은 다른 데이터 유형과 같은 NULL이 될 수 있습니다. 기본 정렬 순서는 다음과 같습니다

    FALSE (0)
    TRUE (1)
    NULL
    

    TRUE 평가하고 마지막 정렬 - 평가하여 -1 제외한 모든 값을 FALSE로 (-1 DISTINCT 정렬되지 않음). 그냥 항목에 의해 보조 순서와 종류 추가합니다.

    이에 상응하는 대안 :

    SELECT *
    FROM   tasks
    ORDER  BY (sort IS DISTINCT FROM -1) DESC, sort;
    

    SQL 바이올린.

  2. ==============================

    2.

    SELECT name FROM tasks
      WHERE f_id=1
      ORDER BY
        CASE COALESCE(sort,88888)
          WHEN -1 THEN 99999
          ELSE         COALESCE(sort,88888)
        END,
        id;
    

    그런데도를 선택하지 않고, 한 번만 않는 유착에 더 우아한 방법을 찾고.

  3. from https://stackoverflow.com/questions/21891803/sorting-null-values-after-all-others-except-special by cc-by-sa and MIT license