是否可以在select?
中保留字符(N)类型的填充空格那是
SELECT left(' 10 '::character(5), 3), right(' 10 '::character(5), 2)
应该返回
' 10', ' '
但它返回
' 10', '10'
我可以以某种方式告诉系统保留所有空格并且不进行任何修剪吗?
我正在使用PostgreSQL 9.6
由于
答案 0 :(得分:1)
https://www.postgresql.org/docs/current/static/functions-string.html
right(str text ,n int)返回字符串中的最后n个字符。 当n为负数时,返回除第一个| n |之外的所有数据字符。
当您使用可变长度字符串时实际发生:
t=# SELECT left(' 10 '::character(5), 3), right(' 10 '::character varying(5), 2);
-[ RECORD 1 ]
left | 10
right |
它返回两个空格
正如Abelisto在回答中所说,the documentation clearly states关于字符数据类型:
将字符值转换为1时,将删除尾随空格 其他字符串类型。
因此right
和left
会根据其定义删除空格。要避免它,你需要使用不同的文字
<强>更新强>
当你将char(5)显式地转换为text时,空格被删除 - 为了避免它,你可以使用在处理之前不会隐式地将任何字符串转换为文本的函数,从而尊重你的结束空格,例如concat
:
t=# with a(v) as (select ' 10 '::character(5))
, monkey_cast as (select concat(v,'') v from a)
select quote_ident(v),left(v,3), right(v,3) from monkey_cast;
quote_ident | left | right
-------------+------+-------
" 10 " | 10 | 0
(1 row)
答案 1 :(得分:1)
它是character
类型的“特征” - 它认为尾随空格无关紧要:
select quote_ident(' 10 '::char(5)), quote_ident(' 10 '::varchar(5));
┌─────────────┬─────────────┐
│ quote_ident │ quote_ident │
╞═════════════╪═════════════╡
│ " 10" │ " 10 " │
└─────────────┴─────────────┘
因此,如果您关心尾随空格 - 请改用varchar
或text
类型。