如何创建一个填充查询结果的新列?

时间:2015-02-06 12:39:15

标签: sql oracle oracle11g

我有一个VARCHAR2列,字符串包含日期和时间。我已经提取了日期,现在希望仅使用日期和时间来填充新列。

到目前为止,我有:

alter table t
add cb_time
as
select substr(t.notes, 24, INSTR(t.notes, 'for')-1)
from Mytable t

这导致错误ORA 2000 - 缺失(关键字

5 个答案:

答案 0 :(得分:2)

另一种方法是将CB_TIME创建为虚拟列。要使用类似以下的ALTER TABLE:

ALTER TABLE T
  ADD CB_TIME DATE GENERATED ALWAYS AS
        (TO_DATE(SUBSTR(t.notes, 24, INSTR(t.notes, 'for')-1))) VIRTUAL;

由于虚拟列不能被插入或更新,因此这样做意味着NOTES字段必须始终包含有效的日期字符串。

分享并享受。

答案 1 :(得分:1)

因为您使用11g,并且正如您所说两列都在同一个表中。我建议,不要添加静态列,而是添加虚拟列

因此,您也不必担心插入。 Oracle会在没有实际存储的情况下为您提供计算值。

只需将虚拟列添加为 -

即可

编辑最后没有一个结束括号。

ALTER TABLE t ADD
       column_name GENERATED ALWAYS AS     (to_date(substr(t.notes, 24, INSTR(t.notes, 'for')-1))) VIRTUAL;

注意但您需要谨慎。只有正确评估表达式,虚拟列才能工作。在这种情况下,如果 datetime literal 格式错误,则虚拟列将失败。确保基本列中的所有值都具有正确的datetime文字格式。

答案 2 :(得分:0)

你应该把它作为两个独立的操作。

alter table t add cb_time date;

update t set cb_time = to_date(substr(...

答案 3 :(得分:0)

您首先要添加ALTER TABLE列,然后发出UPDATE

ALTER TABLE t
  ADD cb_time DATE;

UPDATE t
   SET cb_time = SUBSTR(t.notes, 24, INSTR(t.notes, 'for')-1);

但您还应该同时将该值转换为DATE

UPDATE t
   SET cb_time = TO_DATE(SUBSTR(t.notes, 24, INSTR(t.notes, 'for')-1));

确保t.notes中的值包含日期(可能使用正则表达式)甚至可能是个好主意,这样您在更新时就不会收到错误。

答案 4 :(得分:0)

你可以试试;

alter table t add cb_time date;
update t set cb_time = to_date(substr(t.notes, 24, INSTR(t.notes, 'for')-1);