添加临时列,默认为Oracle SQL中现有列的修剪

时间:2017-03-28 09:50:34

标签: sql oracle trim alter

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

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

" John Smith   "
"  Jay Morgan  "

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

"John Smith"
"Jay Morgan"

SQL:

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

然而,这不起作用。我想做一些不可能的事吗?

3 个答案:

答案 0 :(得分:1)

您可以在默认值中使用触发器而不是函数。 这是一个例子:

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

  

对默认列值的限制   DEFAULT表达式不能包含对PL / SQL函数或其他列的引用,伪列CURRVAL,NEXTVAL,LEVEL,PRIOR和ROWNUM,或未完全指定的日期常量。

Oracle Doc

答案 1 :(得分:1)

这对我有用(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;

答案 2 :(得分:1)

添加virtual column

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