我的查询
中有下面的代码,但我不喜欢它。
(
(year + 1) = date_part('YEAR', CURRENT_DATE) OR
year = date_part('YEAR', CURRENT_DATE) OR
(year - 1) = date_part('YEAR', CURRENT_DATE)
)
是否存在更好的形式来编写此条件?此条件的目标是返回今天后一年和前一年之间的值。
编辑
我想要一个新功能:
SELECT DISTINCT ON (alias.year) alias.year, alias.another_column
FROM scheme.table AS alias
WHERE alias.active IS TRUE AND ABS(alias.year- date_part('YEAR', CURRENT_DATE)) IN (0,1)
ORDER BY alias.year, alias.another_column DESC;
上面的代码返回:
我要:
2017 - 8
2018 - 1
2019 - 1
发生这种情况是因为不存在 2019 年的任何记录,但是当某年不存在时,我需要在另一列中将值 1 返回给他。
最佳答案
试试这个,between 将匹配低值和高值之间的值。
(date_part('YEAR', CURRENT_DATE) BETWEEN (year - 1) AND (year + 1))
编辑:
要完成您所说的,使用 common table expression 可能更容易和一个 RIGHT OUTER JOIN公共(public)表表达式将填充范围内的年份(去年、今年、明年) 并将记录限制为 cte 中的内容,即使该年的表中不存在记录。
WITH RECURSIVE cte(year) AS(
VALUES (date_part('YEAR', CURRENT_DATE)-1)
UNION ALL
SELECT year+1 FROM cte WHERE year<date_part('YEAR', CURRENT_DATE)+1
)
SELECT DISTINCT ON (cte.year) alias.year, COALESCE(alias.another_column, 'value when blank') another_column
FROM scheme.table AS alias
RIGHT OUTER JOIN cte
ON alias.year = cte.year
WHERE alias.active IS TRUE
ORDER BY cte.year, alias.another_column DESC;
所以记录会这样显示
2017 - 8
2018 - 1
2019 - value when blank
如果删除 COALESCE函数看起来像这样
2017 - 8
2018 - 1
2019 - NULL
编辑:
正如评论中的建议,您也可以使用 generate_series()创建公用表表达式
。因为 date_part
返回一个 double precision
所以你必须 CAST它到一个 integer
我使用了两种方法所以你有更多的选择
WITH cte AS (
SELECT
generate_series(
date_part('YEAR', CURRENT_DATE)::integer-1
,CAST(date_part('YEAR', CURRENT_DATE) AS INTEGER)+1
) AS year
)
关于sql - 编写 SQL 条件的更好方法 [编辑 - 需要精选],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49986702/