在插入过程中防止尾随空格?

时间:2012-04-03 15:50:34

标签: postgresql types insert whitespace trim

我有这个INSERT语句,acct_desc字段的末尾似乎有尾随空格。我想知道如何防止在insert语句中出现尾随空格。

INSERT INTO dwh.attribution_summary
SELECT d.adic,
       d.ucic,
       b.acct_type_desc as acct_desc,
       a.begin_mo_balance as opening_balance,
       c.date,
      'fic' as userid
FROM  fic.dim_members d 
JOIN  fic.fact_deposits a ON d.ucic = a.ucic 
JOIN  fic.dim_date c ON a.date_id = c.date_id 
JOIN  fic.dim_acct_type b ON a.acct_type_id = b.acct_type_id
WHERE c.date::timestamp = current_date - INTERVAL '1 days';

3 个答案:

答案 0 :(得分:5)

使用PostgreSQL trim()功能 有trim(), rtrim() and ltrim()。 修剪尾随空格

...
rtrim(b.acct_type_desc) as acct_desc,
...

如果acct_type_desc不是text or varchar类型,请先将其转换为文字:

...
rtrim(b.acct_type_desc::text) as acct_desc,
...

如果acct_type_desc的类型为char(n),则将其强制转换为文本会自动删除尾随空格,不需要trim()

答案 1 :(得分:3)

acct_desc的类型是什么?

  • 如果是CHAR(n),那么DBMS别无选择,只能在末尾添加空格; SQL标准要求。
  • 如果是VARCHAR(n),则DBMS不会在末尾添加空格。
  • 如果PostgresSQL支持它们,那么类型的国家变体(NCHAR,NVARCHAR)的行为与相应的非国家变体的行为相同。

答案 2 :(得分:0)

除了其他人说的话,在该列中添加CHECK CONSTRAINT,因此,如果忘记了在INSERT语句中传递rtrim()函数,则检查约束不会。

例如,检查字符串的结尾空格(末尾):

ALTER TABLE dwh.attribution_summary 
ADD CONSTRAINT tcc_attribution_summary_trim
CHECK (rtrim(acct_type_desc) = acct_type_desc);

另一个示例,检查前导和尾随空格以及字符串中间的连续空白):

ALTER TABLE dwh.attribution_summary 
ADD CONSTRAINT tcc_attribution_summary_whitespace
CHECK (btrim(regexp_replace(acct_type_desc, '\s+'::text, ' '::text, 'g'::text)) = acct_type_desc);