sql case在一列中返回多个未知字符串值

时间:2014-12-05 14:40:31

标签: sql postgresql

我有一张表存储森林地块的测量结果。该表格标题如下:

id, plot_id, date, plot_measurement_type_id, value_type_id, value_int, value_real, value_bool, value_char, measurement_units_id

它的目的是保留尽可能多的灵活性,因为多年来情节会有很多不同类型的测量,并希望保留小表。

plot_measurement_type_id涉及不同类型的测量。在主要情况下,每个情节只有一个测量日期。但是,当measurement_type_id = 5或6时,这是观察,可能有很多。有没有办法使用case语句(如下所示)并将所有观察结果(例如所有5个)连接成一列。我的工作是使用max和min将观察结果放到单独的表中,但是当有几个观察时这不起作用。

我打算创建一个视图,以便以更易读的格式为用户显示数据......使用以下查询。

select pl.plot_id, 
    max(case when pm.plot_measurement_type_id = 1 then value_real end) slope,
    max(case when pm.plot_measurement_type_id = 2 and value_bool = TRUE then 'true' else 'false' end) burnt,
    max(case when pm.plot_measurement_type_id = 3 then value_real end) estimated_tree_canopy,
    max(case when pm.plot_measurement_type_id = 4 then value_real end) estimated_grass_cover,   
    max(case when pm.plot_measurement_type_id = 5 then value_char end) human_use,   
    min(case when pm.plot_measurement_type_id = 5 then value_char end) human_use2,
    max(case when pm.plot_measurement_type_id = 6 then value_char end) observations,
    max(case when pm.plot_measurement_type_id = 7 then value_char end) notes, 
    max(case when pm.plot_measurement_type_id = 9 then value_real end) wet_litter_weight,
    max(case when pm.plot_measurement_type_id = 11 then value_real end) dry_litter_weight,
    max(case when pm.plot_measurement_type_id = 10 then value_real end) wet_grass_weight,
    max(case when pm.plot_measurement_type_id = 12 then value_real end) dry_grass_weight,
    max(case when pm.plot_measurement_type_id = 13 then value_real end) altitude,
    max(case when pm.plot_measurement_type_id = 14 then value_char end) lcc
from forest.plots pl 
    inner join forest.plot_measurement pm on pm.plot_id = pl.plot_id 
group by pl.plot_id

1 个答案:

答案 0 :(得分:1)

是。在Postgres中,您可以使用string_agg()函数:

string_agg(case when pm.plot_measurement_type_id = 5 then value_char end, ', ') human_use2,