我正在尝试向表中添加临时列,以便修复原始列中的前导和尾随空格。
原始列值(不包括语音标记):
" John Smith "
" Jay Morgan "
临时列值(不包括语音标记):
"John Smith"
"Jay Morgan"
SQL:
alter table persons
add t_full_name as default trim(full_name);
然而,这不起作用。我想做一些不可能的事吗?
答案 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,或未完全指定的日期常量。
答案 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)
ALTER TABLE PERSONS
ADD t_full_name GENERATED ALWAYS AS ( TRIM( BOTH FROM full_name ) );