添加默认为 Oracle SQL 中现有列的 trim 的临时列

Add temp column with default as trim of an existing column in Oracle SQL

我正在尝试向 table 添加一个临时列,以修复原始列中的前导和尾随空格。

原始列值(不包括语音标记):

" John Smith   "
"  Jay Morgan  "

临时列值(不包括语音标记):

"John Smith"
"Jay Morgan"

SQL:

alter table persons
add t_full_name as default trim(full_name);

但是,这不起作用。我是不是在尝试做一些不可能的事情?

您可以使用触发器代替默认值中的函数。 举个例子:

CREATE TRIGGER setTrimValue BEFORE INSERT ON persons
FOR EACH ROW
BEGIN
   :new.t_full_name := TRIM(:OLD.full_name)
END;

请在此处查看:Use function as default value for column in Oracle11g

Restriction on Default Column Values A DEFAULT expression cannot contain references to PL/SQL functions or to other columns, the pseudocolumns CURRVAL, NEXTVAL, LEVEL, PRIOR, and ROWNUM, or date constants that are not fully specified.

Oracle Doc

这对我有用(Oracle 11g):

CREATE TABLE T2 (full_name VARCHAR2(40));
INSERT INTO T2 (full_name) VALUES ('  test  ');
SELECT * FROM T2;
ALTER TABLE T2 ADD (fu2 VARCHAR2(40) as (TRIM(full_name)));
SELECT * FROM T2;

输出

FULL_NAME   FU2
  test      test

评论后添加。 如果稍后你想按照你所说的重命名列,你可以执行以下操作:

ALTER TABLE T2 ADD fu3 VARCHAR2(40);
UPDATE T2 SET fu3=fu2;
ALTER TABLE T2 DROP COLUMN fu2;
ALTER TABLE T2 DROP COLUMN full_name;
ALTER TABLE T2 RENAME COLUMN fu3 TO full_name;

或者直接,如果您不想进行中间检查:

UPDATE T2 SET full_name=fu2;
ALTER TABLE T2 DROP COLUMN fu2;

添加一个virtual column:

ALTER TABLE PERSONS
ADD t_full_name GENERATED ALWAYS AS ( TRIM( BOTH FROM full_name ) );