我有表“客户”:
ID Code Name
1 10 Marry
我想要得到的结果是:
1^10^Marry
但我不想像这样明确地命名每一列:
select ID||^||Code||^Name
from Customers
有什么建议么?
我有表“客户”:
ID Code Name
1 10 Marry
我想要得到的结果是:
1^10^Marry
但我不想像这样明确地命名每一列:
select ID||^||Code||^Name
from Customers
有什么建议么?
关于您唯一的选择是:
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。一些驱动程序(如 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 上对你不起作用,它太旧了。