-1

我有表“客户”:

 ID   Code Name
 1    10   Marry 

我想要得到的结果是:

  1^10^Marry

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

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

有什么建议么?

4

1 回答 1

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. 例如,这适用于psqlPgJDBC,但不适用于 PgJDBC。一些驱动程序(如 PgJDBC)提供了它们自己的 API,让您可以COPY间接使用。COPY有关使用该命令的信息,请参阅驱动程序手册。

一个不需要COPY支持的非常丑陋的替代方案是:

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

但这会将任何逗号转换为^,因此如果您的Name字段包含Doe, John您将获得Doe^ John输出 - 可能不是您想要的。Pg 将引用包含逗号的字段,但替换不会尊重该引用。regexp_replace如果你足够努力,你可能会想出一个可以做到的表达方式;您还必须处理"字符串中文字的大小写(导致""输出)。请参阅此 SQLFiddle 示例


我最初以为您可能只是试图摆脱||运算符,在这种情况下,如果您不使用如此旧版本的 PostgreSQL,这会有所帮助:

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

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

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

反而。这在 8.3 上对你不起作用,它太旧了。

于 2013-04-15T06:51:05.213 回答