Предотвратить пробелы во время вставки? - PullRequest
3 голосов
/ 03 апреля 2012

У меня есть этот оператор INSERT, и, похоже, в конце полей acct_desc имеются пробелы.Я хотел бы знать, как предотвратить появление пробелов во время выполнения оператора вставки.

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 ]

5 голосов
/ 03 апреля 2012

Используйте функцию PostgreSQL trim().
Есть trim(), rtrim() и ltrim(). Чтобы обрезать конечные пробелы :

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

Если acct_type_desc не относится к типу text или varchar, сначала приведите его к тексту:

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

Если acct_type_desc имеет тип char(n), приведение его к тексту автоматически удаляет завершающие пробелы, trim() не требуется.

3 голосов
/ 03 апреля 2012

Какой тип acct_desc?

  • Если это CHAR (n), то у СУБД нет выбора, кроме как добавить пробелы в конце;Стандарт SQL требует, чтобы это было.
  • Если это VARCHAR (n), то СУБД не будет добавлять пробелы в конце.
  • Если PostgresSQL их поддерживал, национальные варианты типов (NCHAR, NVARCHAR) будет вести себя так же, как и соответствующий не национальный вариант.
1 голос
/ 14 августа 2018

Помимо того, что сказали другие, добавьте CHECK CONSTRAINT к этому столбцу, так что если кто-то забудет передать функцию rtrim() внутри оператора INSERT, ограничение проверки не будет.

Например, проверьте конечные пробелы (в конце) строки:

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);
...