Добавить временный столбец по умолчанию в качестве обрезки существующего столбца в Oracle SQL

Я пытаюсь добавить временный столбец в таблицу, чтобы исправить начальные и конечные пробелы в исходном столбце.

Исходные значения столбца (исключая речевые метки):

" John Smith   "
"  Jay Morgan  "

Временные значения столбца (исключая речевые метки):

"John Smith"
"Jay Morgan"

SQL:

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

Однако это не работает. Я пытаюсь сделать что-то невозможное?


person Singh    schedule 28.03.2017    source источник
comment
Что в этой колонке делает ее временной?   -  person Damien_The_Unbeliever    schedule 28.03.2017
comment
Извините, это была опечатка, она временная, потому что она должна существовать какое-то время, получая свое значение из исходного столбца как обрезанное, пока я не удалю исходный столбец и не переименую временный столбец в исходный.   -  person Singh    schedule 28.03.2017
comment
Вы искали, как добавить столбец? Например, где вы определяете тип данных.   -  person HoneyBadger    schedule 28.03.2017
comment
Да, я знаю синтаксис ALTER TABLE имя_таблицы ADD имя_столбца тип данных; Пробовал использовать VARCHAR2(255) вместо as - тоже не работает.   -  person Singh    schedule 28.03.2017
comment
Есть ли причина, по которой вы не хотите просто обновлять существующие значения столбца - производительность? Можно ли добавить новые строки после добавления этого нового столбца? И добавляете ли вы ограничение на новый столбец, чтобы предотвратить начальные/конечные пробелы в будущем? Может быть проще добавить (постоянный) виртуальный столбец и оставить заполненный столбец в покое.   -  person Alex Poole    schedule 28.03.2017


Ответы (3)


Это сработало для меня (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;
person etsa    schedule 28.03.2017
comment
Это работает, но создает временный столбец как виртуальный столбец, который не позволяет мне переименовывать/удалять исходный столбец, как он используется в выражении fu2. - person Singh; 28.03.2017
comment
@Singh Я добавил кое-что, чтобы ответить (надеюсь, я понял ваши потребности) - person etsa; 28.03.2017
comment
Да, я видел это, но сейчас слишком много операций. Теперь я решил проблему, используя процедуру и обновив все столбцы VARCHAR2 до урезанной версии исходного столбца. - person Singh; 28.03.2017

Вы можете использовать триггер вместо функции в значении по умолчанию. Вот пример:

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

Пожалуйста, проверьте здесь: Использовать функцию в качестве значения по умолчанию для столбца в Oracle11g< /а>

Ограничение на значения столбцов по умолчанию Выражение DEFAULT не может содержать ссылки на функции PL/SQL или другие столбцы, псевдостолбцы CURRVAL, NEXTVAL, LEVEL, PRIOR и ROWNUM или константы даты, которые не указаны полностью.

Документ Oracle

person fingerprints    schedule 28.03.2017
comment
Спасибо за фрагмент/ссылку на документацию, это действительно помогает. - person Singh; 28.03.2017
comment
Вы можете использовать trim(), так как это встроенная функция, а не функция PL/SQL. Но вы не можете ссылаться на столбец full_name, о чем также говорится в ссылке на документ. Однако триггер не будет устанавливать значение для существующих строк. - person Alex Poole; 28.03.2017
comment
Хм. Мне нужно, чтобы существующие строки также были исправлены. В любом случае, я решил проблему сейчас, фактически обновив исходный столбец до обрезки (original_column). - person Singh; 28.03.2017

Добавьте виртуальный столбец:

ALTER TABLE PERSONS
ADD t_full_name GENERATED ALWAYS AS ( TRIM( BOTH FROM full_name ) );
person MT0    schedule 28.03.2017
comment
Я не могу использовать виртуальный столбец, так как это вызывает проблемы позже при переименовании исходного столбца. - person Singh; 28.03.2017