RE:列名

时间:2016-09-08 18:30:51

标签: postgresql

Greatest value of multiple columns with column name?

我正在阅读上面的问题(上面的链接)和“接受”的答案(这似乎是正确的),并且有几个关于这个答案的问题。

(抱歉,我必须创建一个新帖子,没有足够高的声誉来评论旧帖子,因为它看起来很旧)

问题
我的第一个问题是“@var_max_val:=”的意义是什么?没有它我重新查询,一切都运行良好。

我的第二个问题是,有人可以解释这是如何达到预期效果的:

 CASE @var_max_val WHEN col1 THEN 'col1'
                     WHEN col2 THEN 'col2'
                     ...
   END AS max_value_column_name

我的第三个问题如下:

似乎在这个“case”语句中,他手动必须为表中的每一列写一行代码(“当x然后y”时)。如果您有1-5列,这很好。但是,如果你有10,000?你会怎么做?

PS:我可能在这篇文章中违反了一些论坛规则,如果我是,请告诉我。 感谢您的阅读,谢谢您的时间!

2 个答案:

答案 0 :(得分:4)

链接的问题是关于mysql所以它不适用于postgresql(例如@var_max_val语法特定于mysql)。要在postgresql中完成相同的操作,您可以使用LATERAL子查询。例如,假设您有以下表格和示例数据:

CREATE TABLE t(col1 int, col2 int, col3 int);
INSERT INTO t VALUES (1,2,3), (5,8,6);

然后,您可以使用以下查询识别每行的最大列:

SELECT *
FROM t, LATERAL (
            VALUES ('col1',col1),('col2',col2),('col3',col3)
            ORDER BY 2 DESC
            LIMIT 1
        ) l(maxcolname, maxcolval);

产生以下输出:

 col1 | col2 | col3 | maxcolname | maxcolval 
------+------+------+------------+-----------
    1 |    2 |    3 | col3       |         3
    5 |    8 |    6 | col2       |         8

我认为这个解决方案比mysql链接文章中提供的解决方案更优雅。

至于不得不手动编写代码,遗憾的是,我认为你无法避免这种情况。

答案 1 :(得分:3)

在Postgres 9.5中,您可以使用jsonb functions来获取列名。在这种情况下,您不必手动编写所有列名称。解决方案需要主密钥(或唯一列)才能正确使用 分组:

create table a_table(id serial primary key, col1 int, col2 int, col3 int);
insert into a_table (col1, col2, col3) values (1,2,3), (5,8,6);

select distinct on(id) id, key, value
from a_table t, jsonb_each(to_jsonb(t))
where key <> 'id'
order by id, value desc;

 id | key  | value 
----+------+-------
  1 | col3 | 3
  2 | col2 | 8
(2 rows)