使用分隔符自动连接所有列

时间:2013-04-15 06:37:29

标签: postgresql

我有桌子“Custommers”:

 ID   Code Name
 1    10   Marry 

我想得到的结果是:

  1^10^Marry

但我不想像这样明确地命名每一列:

select ID||^||Code||^Name 
from Customers

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

关于您唯一的选择是:

COPY Customers TO stdout WITH DELIMITER '^' CSV;

所以这应该可以帮助你,直到你可以升级。如果您不想要整个表,则可以从COPY查询中仅指定COPY(SELECT ...)列的子集,例如:

COPY Customers("ID") TO stdout WITH DELIMITER '^' CSV;

COPY (SELECT * FROM Customers WHERE "ID" <> 4) TO stdout WITH DELIMITER '^' CSV;

并非所有客户端驱动程序都支持COPY。例如,这可以从psql开始,但不能用于PgJDBC。某些驱动程序(如PgJDBC)提供了自己的API,允许您间接使用COPY。有关使用COPY命令的信息,请参阅驱动程序手册。

不需要COPY支持的非常难看的替代方案是:

SELECT (regexp_matches(replace(Customers::text,',','^'), '\((.*)\)'))[1] FROM Customers;

但是这会将任何逗号转换为^,因此如果您的Name字段包含Doe, John,您将获得Doe^ John作为输出 - 可能不是你想要的。 Pg将引用包含逗号的字段,但替换不会尊重引用。你可能会想出一个regexp_replace表达式,如果你足够努力就会这样做;你必须处理字符串中文字"的情况(在输出中产生"")。请参阅this SQLFiddle example


我原本以为你可能只是试图摆脱||运算符,在这种情况下,如果你没有使用这样一个旧版本的PostgreSQL,这将有所帮助:

SELECT concat_ws('^', "ID", "Code", "Name") FROM Customers;

另请注意,上面的COPY语法是过时的样式。现代PostgreSQL版本的新代码应该使用:

COPY Customers TO stdout WITH (FORMAT CSV, DELIMITER '^')

代替。这对你来说不适用于8.3,它太旧了。