Классифицируйте ненужные элементы в PostgreSQL - PullRequest
1 голос
/ 17 марта 2020

Я использую PostgreSQL 10.6 и хочу прочитать таблицу с массивом дат. Моя цель состоит в том, чтобы классифицировать каждую дату в этом массиве и сравнивать ее с датой дня, чтобы отразить их в категории: прошлое, настоящее, будущее.

С учетом случая я уже классифицировал записи в зависимости от их значения и, с другой стороны, я могу удалить элементы из этого массива. Но когда я пытаюсь использовать оператор case в нестандартных элементах, ответ не тот, который я ожидаю.

myTable

id(integer) | dates(date[])
---------------------------
1           | {2020-03-17}
2           | {2020-03-17,2020-03-16}
3           | {2020-03-16,2020-03-15}
4           | {2020-03-17,2020-03-18}
5           | {2020-03-16,2020-03-18}

Простой запрос возвращает мне каждую дату в отдельной строке

SELECT id, UNNEST(dates) FROM myTable

Другой запрос возвращает мне не очень хороший результат, потому что некоторые даты в прошлом отображаются, например, «Futur».

SELECT
    id,
    UNNEST(dates),
    CASE
        WHEN dates < ARRAY[now()::date] THEN 'Past'
        WHEN dates = ARRAY[now()::date] THEN 'Present'
        WHEN dates > ARRAY[now()::date] THEN 'Futur'
    END AS myResult
FROM myTable
ORDER BY UNNEST(dates) DESC

Как Могу ли я добиться этого результата? Я думаю, что упускаю что-то важное.

id |     dates     |   myResult
--------------------------------
4  | {2020-03-18}  |   Futur
5  | {2020-03-18}  |   Futur
1  | {2020-03-17}  |   Present
2  | {2020-03-17}  |   Present
4  | {2020-03-17}  |   Present
2  | {2020-03-16}  |   Past
3  | {2020-03-16}  |   Past
5  | {2020-03-16}  |   Past
3  | {2020-03-15}  |   Past

1 Ответ

2 голосов
/ 17 марта 2020

Вам нужно отменить вкладку в предложении from - тогда вы можете классифицировать его в предложении from:

SELECT
    t.id,
    d.dt,
    CASE
        WHEN d.dt < current_date THEN 'Past'
        WHEN d.dt = current_date THEN 'Present'
        WHEN d.dt > current_date THEN 'Futur'
    END AS myResult
FROM myTable t
CROSS JOIN LATERAL UNNEST(t.dates) d(dt)
ORDER BY t.id, d.dt DESC

Демонстрация на DB Fiddle :

id | dt         | myresult
-: | :--------- | :-------
 1 | 2020-03-17 | Present
 2 | 2020-03-17 | Present
 2 | 2020-03-16 | Past
 3 | 2020-03-16 | Past
 3 | 2020-03-15 | Past
 4 | 2020-03-18 | Futur
 4 | 2020-03-17 | Present
 5 | 2020-03-18 | Futur
 5 | 2020-03-16 | Past
...