Какой эквивалент Oracle NULLS FIRST в DB2? - PullRequest
2 голосов
/ 01 ноября 2010

Есть ли в DB2 что-то вроде ORDER BY ord_col NULLS FIRST?

Ответы [ 3 ]

9 голосов
/ 01 ноября 2010

Вы используете case в order by для сортировки пустых значений перед другими значениями:

select  *
from    YourTable
order by
        case when col1 is null then 0 else 1 end
,       col1
3 голосов
/ 02 ноября 2010

В DB2 нет ничего подобного ORDER BY ord_col NULLS FIRST, но вы можете использовать функции, чтобы получить такое же поведение:

CREATE TABLE TV84 (
   CORN CHAR(2) NOT NULL
  ,COUAG CHAR(4) NOT NULL
  ,DDFA DATE NOT NULL
  ,MTFAC1 INTEGER
);

INSERT INTO TV84 (CORN,COUAG,DDFA,MTFAC1)
VALUES ('01','0309',TO_DATE('10.05.2008','MM.DD.YYYY'),2520);
INSERT INTO TV84 (CORN,COUAG,DDFA,MTFAC1)
VALUES ('01','0309',TO_DATE('12.14.2008','MM.DD.YYYY'),NULL);
INSERT INTO TV84 (CORN,COUAG,DDFA,MTFAC1)
VALUES ('01','0309',TO_DATE('10.15.2009','MM.DD.YYYY'),6452);
INSERT INTO TV84 (CORN,COUAG,DDFA,MTFAC1)
VALUES ('02','0309',TO_DATE('06.16.2010','MM.DD.YYYY'),1283);
INSERT INTO TV84 (CORN,COUAG,DDFA,MTFAC1)
VALUES ('02','0309',TO_DATE('08.28.2010','MM.DD.YYYY'),NULL);
  • С помощью скалярной функции COALESCE:
SELECT CORN, COUAG, DDFA, MTFAC1
FROM TV84
ORDER BY COALESCE(MTFAC1,0);

CORN COUAG DDFA       MTFAC1
---- ----- ---------- -----------
01   0309  14.12.2008           -
02   0309  28.08.2010           -
02   0309  16.06.2010        1283
01   0309  05.10.2008        2520
01   0309  15.10.2009        6452
SELECT CORN, COUAG, DDFA, MTFAC1
  ,ROW_NUMBER() OVER (ORDER BY MTFAC1 NULLS FIRST) RN
FROM TV84
ORDER BY RN;

CORN COUAG DDFA       MTFAC1      RN
---- ----- ---------- ----------- --------------------
01   0309  14.12.2008           -                    1
02   0309  28.08.2010           -                    2
02   0309  16.06.2010        1283                    3
01   0309  05.10.2008        2520                    4
01   0309  15.10.2009        6452                    5

Обновление : Для решения функции OLAP, если вам нужно упорядочить по дополнительному столбцу, лучше использовать функции RANK или DENSE_RANK:

SELECT CORN, COUAG, DDFA, MTFAC1
  ,RANK() OVER (ORDER BY MTFAC1 NULLS FIRST) RNK
FROM TV84
ORDER BY RNK;

CORN COUAG DDFA       MTFAC1      RNK
---- ----- ---------- ----------- --------------------
01   0309  14.12.2008           -                    1
02   0309  28.08.2010           -                    1
02   0309  16.06.2010        1283                    3
01   0309  05.10.2008        2520                    4
01   0309  15.10.2009        6452                    5
1 голос
/ 01 ноября 2010

Нет, я в это не верю.

Вы можете эмулировать поведение с помощью чего-то вроде:

select 0 as seq, col1, col2 from tbl where col1 is null
union all
select 1 as seq, col1, col2 from tbl where col1 is not null
order by 1, 2

и затем игнорируете столбец seq в коде обработки данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...