我有一个PostgreSQL函数(或表),它给了我以下输出:
Sl.no username Designation salary etc..
1 A XYZ 10000 ...
2 B RTS 50000 ...
3 C QWE 20000 ...
4 D HGD 34343 ...
字符串
现在我想要的输出如下:
Sl.no 1 2 3 4 ...
Username A B C D ...
Designation XYZ RTS QWE HGD ...
Salary 10000 50000 20000 34343 ...
型
如何做到这一点?
5条答案
按热度按时间ygya80vv1#
字符串
引用:convertingColumnsToString
zu0ti5jz2#
根据我的回答表的形式:
字符串
每一行都会产生一个要返回的新列。对于像这样的动态返回类型,很难通过对数据库的一次调用使其完全动态化。通过两个步骤演示解决方案:
1.生成查询
1.执行生成的查询
一般来说,这是由一个表可以容纳的最大列数限制的。因此,对于行数超过1600(或更少)的表,这不是一个选项。详细信息:
波斯特瑞斯9.4+
采用
crosstab()
的动态解决方案如果可以的话就用第一个。胜过其他的。
型
使用
attnum
而不是实际的列名进行操作。更简单、更快。再次将结果与pg_attribute
连接,或者像第9.3页的示例中那样集成列名。生成以下形式的查询:
型
这使用了一系列的高级功能。只是太多解释不清了。
采用
unnest()
的简单解决方案一个
unnest()
现在可以并行执行多个数组的取消嵌套。型
测试结果:
型
老古董
Posterre 9.3或更低版本
crosstab()
动态解决方案型
可以用一个参数 Package 成一个函数...
生成以下形式的查询:
型
产生所需的结果:
型
采用
unnest()
的简单解决方案型
生成以下形式的查询:
型
同样的结果。
6qqygrtg3#
如果(像我一样)你需要从bash脚本中获取这些信息,请注意,psql有一个简单的命令行开关,告诉它将表列输出为行:
字符串
-x
选项是让psql将列输出为行的关键。zazmityj4#
我有一个比Erwin上面提到的更简单的方法,它适用于Postgres(我认为它应该适用于所有支持SQL标准的主要关系数据库)
你可以使用UNION代替crosstab:
字符串
当然,这取决于你要应用它的情况。考虑到你事先知道你需要什么字段,你可以采取这种方法,即使是查询不同的表。即:
型
这是一个更主要的方法,恕我直言。查看此页面以获取更多信息:https://www.postgresql.org/docs/current/typeconv-union-case.html
oymdgrw75#
在普通SQL或PL/pgSQL中没有正确的方法来做到这一点。
在从DB获取数据的应用程序中执行此操作会更好。