Sql 如何忽略子查询中的空值?

Sql 如何忽略子查询中的空值?,sql,postgresql,Sql,Postgresql,我有一个输出这些结果的查询 "year" avg_carbon company_carbon 1998 7909.0000000000000000 1999 19465.500000000000 2000 19478.000000000000 2001 182679.274509803922 3284586 2002 179821.156862745098 3165363 2003 190188.882352941176

我有一个输出这些结果的查询

"year"  avg_carbon  company_carbon
1998    7909.0000000000000000   
1999    19465.500000000000  
2000    19478.000000000000  
2001    182679.274509803922 3284586
2002    179821.156862745098 3165363
2003    190188.882352941176 3675122
2004    193355.040000000000 3433656
2005    190449.403846153846 3515522
2006    192247.818181818182 3752861
2007    190654.457627118644 3764109
2008    175522.153846153846 3455017
2009    165951.555555555556 3575654
2010    191000.347222222222 3401381
2011    195159.617647058824 3720983
2012    166948.710144927536 2727370
2013    155486.625000000000 2750040
2014    205681.795454545455 2493060
2015    350699.592920353982 2140280
2016    341955.322033898305 2028865
2017    322747.352000000000 1642010
2018    351676.219298245614 1438365
2019    446680.314285714286 1496520
2020    70971.000000000000  
你可以看到2020年、2000年、1999年和1998年,公司的碳排放量为零。对于这些项目,我希望排除行(因此在上面的示例中,数据范围为2001到2019)

这是我的查询,我无法计算如何基于子查询限制null值(我尝试了carbon不是null或carbon!=0)

欢迎任何意见

试试这个:

SELECT * FROM (
    select year
          ,AVG(carbon) AS AVG_carbon
          ,MAX(carbon) FILTER (WHERE lower(ticker) = 'ibm.us' ) as company_carbon 
    from "company"."carbon" c 
    where lower(c.ticker) in (select lower(g4.ticker)
                              from "company"."General" g4
                              where industry = (select industry from "company"."General" g3 where lower(g3.ticker)  = 'ibm.us' )
   )
   GROUP BY c.year
)
WHERE company_carbon IS NOT NULL
ORDER BY year ASC

看起来像是使用以下功能的简单过滤器:

select year, AVG(carbon) AS AVG_carbon,
    MAX(carbon) FILTER (WHERE lower(ticker) = 'ibm.us') as company_carbon
from "company"."carbon" c
where lower(c.ticker) in (
        select lower(g4.ticker)
        from "company"."General" g4
        where industry = (
                select industry
                from "company"."General" g3
                where lower(g3.ticker) = 'ibm.us'
            )
    )
GROUP BY c.year
having MAX(carbon) FILTER (WHERE lower(ticker) = 'ibm.us') is not null
order by year ASC;
select year, AVG(carbon) AS AVG_carbon,
    MAX(carbon) FILTER (WHERE lower(ticker) = 'ibm.us') as company_carbon
from "company"."carbon" c
where lower(c.ticker) in (
        select lower(g4.ticker)
        from "company"."General" g4
        where industry = (
                select industry
                from "company"."General" g3
                where lower(g3.ticker) = 'ibm.us'
            )
    )
GROUP BY c.year
having MAX(carbon) FILTER (WHERE lower(ticker) = 'ibm.us') is not null
order by year ASC;