POSTGRESQL:对联接表使用case

POSTGRESQL:对联接表使用case,sql,postgresql,Sql,Postgresql,我是Postgresql的新手,所以在这里仍然有点挣扎。请温柔一点 我将连接三个表,并且希望能够使用case语句来引入另一列,该列基于另一列从一列引入所需的值。我猜我的内部连接和CASE语句是背对背的,但我不知道如何在不破坏意图的情况下重新排列它们 基本上:如果model_best_fit==SUNNY,那么我希望一个名为applied_f_model_hours_的新列高于4k,以获得hoursabove4k_SUNNY列的值 代码示例: SELECT * FROM px_fuel_w

我是Postgresql的新手,所以在这里仍然有点挣扎。请温柔一点

我将连接三个表,并且希望能够使用case语句来引入另一列,该列基于另一列从一列引入所需的值。我猜我的内部连接和CASE语句是背对背的,但我不知道如何在不破坏意图的情况下重新排列它们

基本上:如果model_best_fit==SUNNY,那么我希望一个名为applied_f_model_hours_的新列高于4k,以获得hoursabove4k_SUNNY列的值

代码示例:

SELECT *
    FROM px_fuel_weathercell
        INNER JOIN f_descriptions ON px_f_weathercell.px_id = f_descriptions.fuel_id
        INNER JOIN dailywx ON px_f_weathercell.fid_new_wx_cells = dailywx.location
        CASE best_model_fit
            WHEN 'SUNNY' then hoursabove4k_sunny
        END applied_f_model_hours_above4k
    WHERE best_model_fit = 'SUNNY' /* limiting my test case here, clause will be removed later */
LIMIT 1000; 
错误如下:

ERROR:  syntax error at or near "CASE"
LINE 5:   CASE best_model_fit
          ^
SQL state: 42601
Character: 210
谢谢你能提供的任何帮助

加分:案件似乎进展缓慢。运行此查询需要45秒。dailywx有400000行,px_f_weathercell有6000000行。有没有更快的方法

编辑: 进行了以下编辑,当所需的列中包含数字(包括0)时,不会得到一个充满空值的列。两列的类型都是double

EDIT2:更新了两个表名,以指示列的来源。还更新为显示左连接。我还使用PGTune设置了一些建议的设置,以解决进程被磁盘绑定的情况。我还对px_f_weathercell.fid_new_wx_cells和px_f_weathercell.px_id设置了索引。这导致约5-7秒内返回100000条记录。但是,我仍然从CASE语句中接收空值


在表中,所有行都有相同的列。不能有只存在于某些行的列。由于查询结果本质上是一个表,因此也适用于该表

因此,对于信息不适用的行,结果为NULL或0是您唯一的选择

CASE表达式返回NULL的原因是您没有其他分支。如果没有任何条件适用,则结果为空


查询的性能是另一回事。您需要提供解释分析、缓冲输出来分析它。但是在连接大表时,将work\u mem设置得足够高通常是有益的。

将case表达式移动到您的select,这是确定列数的地方。我已经尝试了我认为您的意思,但没有得到一个满是null的列。这至少是向前迈出的一步。编辑上面的内容。您也在内部连接三个表,而不是左连接。如果您不在查询中添加某种类型的过滤器,您将使用大多数记录的笛卡尔积,这意味着您可能需要缓慢地进行全表扫描,但实际上不使用索引,因为没有理由这样做。你能编辑你的问题来显示这些专栏的来源吗?例如,我们不知道best_model_fit或hoursabove4k_sunny从何而来。@ps2goat,感谢您提供有关笛卡尔查询的指针。我已按预期更改为left Join,设置了上面dit中所述的索引广告,并在注意到进程已绑定磁盘io时寻址了内存和缓存大小。我仍在苦苦挣扎的是为什么CASE语句返回null。通常您指定一个else语句。CASE best_model_适合于'SUNNY'时,然后dailywx.hoursabove4k_SUNNY ELSE-1 END applicated_f_model_hours_4k以上-在ELSE子句中使用您想要的任何值作为默认值。如果该查询的所有值都为空,则可能无法正确设置查询的其余部分,或者数据未按您认为的方式设置,例如,它与您的条件不匹配。谢谢@Laurenz Albe。现在,我在这两个语句上都改为左连接,并为此进程设置了相当高的内存/缓存值26GB,并且注意到查询速度显著加快。然而,我仍然无法解释为什么case语句返回null。我已经添加了一个解释。
SELECT *,
    CASE best_model_fit
        WHEN 'SUNNY' then dailywx.hoursabove4k_sunny
    END applied_f_model_hours_above4k
    FROM px_fuel_weathercell
        LEFT JOIN f_descriptions ON px_f_weathercell.px_id = f_descriptions.fuel_id
        LEFT JOIN dailywx ON px_f_weathercell.fid_new_wx_cells = dailywx.location
    WHERE fuel_descriptions.best_model_fit = 'SUNNY' /* limiting my test case here, clause will be removed later */
LIMIT 1000;