在SELECT中保留字符类型的空格

时间:2017-09-19 10:01:07

标签: postgresql

是否可以在select?

中保留字符(N)类型的填充空格

那是

SELECT left(' 10  '::character(5), 3), right(' 10  '::character(5), 2)

应该返回

' 10', '  '

但它返回

' 10', '10'

我可以以某种方式告诉系统保留所有空格并且不进行任何修剪吗?

我正在使用PostgreSQL 9.6

由于

2 个答案:

答案 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时,将删除尾随空格   其他字符串类型。

因此rightleft会根据其定义删除空格。要避免它,你需要使用不同的文字

<强>更新

当你将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  "     │
└─────────────┴─────────────┘

因此,如果您关心尾随空格 - 请改用varchartext类型。