PostgreSQL 行到字符串

标签 postgresql types casting null row

我有一个类似下面的查询的结果,它没有固定数量的列

ID  COL1    COL2    COL3    COL4
-------------------------------------
1   VAL11   VAL12   VAL13   VAL14
2   VAL21   VAL22   VAL23   VAL24

现在我希望结果是这样的。

RESULT
-----------------------------------------------------
ID:1, COL1:VAL11, COL2:VAL12, COL3:VAL13, COL4:VAL14
ID:2, COL1:VAL21, COL2:VAL22, COL3:VAL23, COL4:VAL24

请帮忙。

最佳答案

快速而肮脏的方法,但没有列名并包含 NULL 值:

SELECT tbl::text
FROM   tbl;

缓慢而可靠的方式:

SELECT array_to_string(ARRAY[
          'ID:'   || id
         ,'COL1:' || col1
         ,'COL2:' || col2
        ], ', ')  AS result
FROM    tbl;

如果列包含 NULL 值,则结果中将丢失该列。我不只是连接,因为 NULL 值会使整行无效。
array_to_string()确保只在需要的地方插入逗号。


PostgreSQL 9.1 引入了新函数 concat_ws() (很像 MySQL 中的那个)我们可以进一步简化:

SELECT concat_ws(', '
          'ID:'   || id
         ,'COL1:' || col1
         ,'COL2:' || col2
        ) AS result
FROM    tbl;

关于PostgreSQL 行到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091360/

相关文章:

c++ - 将基本类型数组中的内存重用于不同(但仍然是基本)类型数组是否合法

sql - 如何做出结合来自不同位置的各种结果的选择?

postgresql - 在 PostgresQL 数据库中存储 Twitter Snowflake 字符串的最佳方法是什么?

javascript - 有没有办法使用数字类型作为对象键?

python - Pandas 错误 "Can only use .str accessor with string values"

java - 看不懂double类型转byte类型的结果

postgresql - 如何将时间插入 Redshift

postgresql - 使用 docker swarm 模式时如何将数据保存在卷上?

typescript - 在 Typescript 中优雅地将两种类型组合成一个接口(interface)

typescript 部分接口(interface)奇怪的行为