sql - 编写 SQL 条件的更好方法 [编辑 - 需要精选]

标签 sql postgresql ansi-sql

我的查询中有下面的代码,但我不喜欢它。

     (
       (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;

上面的代码返回:

enter image description here

我要:

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/

相关文章:

php - 优化重复的mysql查询

php - 需要一些重要提示 :- Sql injection for different queries. 。

sql - 如何通过索引优化查询 PostgreSQL

Oracle 带过滤器的全外连接 (ANSI) 未按预期工作

sql - Oracle DECODE 的标准 SQL 替代方案

sql - 如何在Rails中组合内连接和左外连接

php - 通过直接链接锁定对 PDF 文件的访问

postgresql - AWS Lambda 函数找不到包 - Psycopg2

sql - 表 A 引用表 B,我如何插入(使用 Perl 和 DBI 以及 PostgreSQL)

c# - 在 SQL 中克隆带有主键的行?