postgresql 插入时是否防止尾随空格?

xfb7svmp  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(3)|浏览(228)

我有一个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';
bzzcjhmw

bzzcjhmw1#

使用PostgreSQL的trim()函数,其中有trim()rtrim()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),则将其强制转换为text会自动删除尾随空格,不需要trim()

3zwtqj6y

3zwtqj6y2#

除了其他人所说的之外,向该列添加一个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);
5f0d552i

5f0d552i3#

acct_desc的类型是什么?

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

相关问题