我有桌子“Custommers”:
ID Code Name
1 10 Marry
我想得到的结果是:
1^10^Marry
但我不想像这样明确地命名每一列:
select ID||^||Code||^Name
from Customers
有什么建议吗?
答案 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,它太旧了。