我需要以这种方式使用o / p的select语句。
您被分配到以下项目:
有一些空格,特殊字符&新线。为此,我使用了ascii charaters chr(10),chr(32),chr(8226)。 它工作正常,但查询看起来并不好看。我不确定这样做是否是一个好方法。 查询看起来像这样
SELECT
'You are assigned to following projects:' || chr(10) || chr(32) || chr(8226) || chr(32) ||
string_agg(e.projects, chr(10) || chr(32) || chr(8226) || chr(32))
这也适用于所有OS&在每个环境中?
答案 0 :(得分:3)
您有几个选择:
按字面插入字符。通常是最好的选择。想要一个 ”•”?使用类似'this is a •'
的字符串。无需更多内容如果您的client_encoding
是正确的,并且您使用的编码包含您想要的字符(例如•
)。这是SQL标准。换行符可以包含在文字中:
SELECT '
' AS "this_is_a_newline";
此方法可能不适用于某些不可打印的字符,具体取决于数据库实现。对于PostgreSQL,它除了\x00
之外的所有内容都很好,这是零字节,PostgreSQL根本不支持text
/ varchar
等,仅在bytea
。
注意确保您的文本编辑器/ SQL编辑器的文本编码与您的连接告诉PostgreSQL client_encoding
的匹配,否则您将遇到错误的字符串或奇怪的错误。类似unix的终端的用户还需要确保终端编码与client_encoding
匹配,以避免出现奇怪的输出错误。如今,Windows是唯一一个通常存在问题的平台。
在E''
转义字符串中以十六进制或unicode文字插入字符,例如E'this is a \u2022'
。请注意,\u
转义符为十六进制 - 0x2022为十进制8226. E''
语法是PostgreSQL扩展名。
对于定义了速记转义符的字符,请在转义字符串中使用缩写转义符,例如E'\n'
。这是PostgreSQL扩展。
如您所述使用chr(8226)
,但请注意chr
根据您的server_encoding
(数据库的文本编码)解释代码。所以我不鼓励它。对于多字节字符,您只会收到类似ERROR: requested character too large for encoding: 8226
的错误:
regress=> CREATE DATABASE latin ENCODING 'latin-1' LC_CTYPE 'C' LC_COLLATE 'C' TEMPLATE template0;
CREATE DATABASE
regress=> \c latin
You are now connected to database "latin" as user "craig".
latin=> SHOW server_encoding;
server_encoding
-----------------
LATIN1
(1 row)
latin=> SHOW client_encoding;
client_encoding
-----------------
UTF8
(1 row)
latin=> select chr(8226);
ERROR: requested character too large for encoding: 8226
但对于序数在1字节范围内的字符,您可以获得意外字符。取ü
,其中utf-8和latin-1(iso-8859-1)为0xfc
(十进制252),但在iso-8859-5中为ќ
。所以:
regress=> SHOW server_encoding;
server_encoding
-----------------
UTF8
regress=> SELECT chr(252);
chr
-----
ü
regress=> CREATE DATABASE iso5 ENCODING 'iso-8859-5' LC_CTYPE 'C' LC_COLLATE 'C' TEMPLATE template0;
regress=> \c iso5
iso5=> SELECT chr(252);
chr
-----
ќ
所以我的建议是:尽可能使用文字。在必须使用转义符的地方,使用带有unicode转义符的E''
字符串,以防止基于当前服务器编码的代码点含义含糊不清。避免\x
转义和chr
。
对于您编写的具体示例,您应该使用:
SELECT 'You are assigned to following projects:
• A
• B
• C';
对于非常旧的PostgreSQL版本的读者的注意事项:极其旧的PostgreSQL版本不支持E''
字符串并将所有字符串视为转义字符串。所以'\n'
意味着“换行”,现代PostgreSQL遵循SQL标准,其中'\n'
只是字符串“\ n”。只有略有史前版本的版本仍然会这样做,但会对此发出警告并让您通过设置standard_conforming_strings = on
来请求标准行为。这是相当长一段时间的默认值。
答案 1 :(得分:1)
而不是
chr(10) || chr(32) || chr(8226) || chr(32)
只需使用
\n •
在这种情况下没有理由使用chr()
。