对 PostgreSQL 中的 unnest 元素进行分类
Classify unnest elements in PostgreSQL
我正在使用 PostgreSQL
10.6,我想读取一个包含日期数组的 table。我的目标是对该数组中的每个日期进行分类,并将其与当天的日期进行比较,以影响它们的类别:过去、现在、未来。
通过 case 语句,我已经根据记录的值对记录进行了分类,另一方面,我能够从该数组中取消嵌套元素。但是当我在 unnest 元素中尝试 case 语句时,响应不是我所期望的。
我的表格
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}
一个简单的查询 return 每个日期在不同的行中
SELECT id, UNNEST(dates) FROM myTable
另一个查询 return 我的结果不是很好,因为显示了一些过去的日期 "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
您需要在 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
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
我正在使用 PostgreSQL
10.6,我想读取一个包含日期数组的 table。我的目标是对该数组中的每个日期进行分类,并将其与当天的日期进行比较,以影响它们的类别:过去、现在、未来。
通过 case 语句,我已经根据记录的值对记录进行了分类,另一方面,我能够从该数组中取消嵌套元素。但是当我在 unnest 元素中尝试 case 语句时,响应不是我所期望的。
我的表格
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}
一个简单的查询 return 每个日期在不同的行中
SELECT id, UNNEST(dates) FROM myTable
另一个查询 return 我的结果不是很好,因为显示了一些过去的日期 "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
您需要在 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
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