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

How do I create a new column filled with the results of a query?

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

到目前为止我有:

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

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

您应该将其作为两个单独的操作进行。

alter table t add cb_time date;

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

您将首先添加带有 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 中的值包含日期(可能使用正则表达式)甚至可能是个好主意,这样您在更新时就不会出错。

你可以试试;

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

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

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

只需将虚拟列添加为 -

编辑最后缺少右括号。

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

注意不过你需要小心。虚拟列只有在 expression 被正确评估时才能工作。在这种情况下,如果 datetime 文字 格式不正确,则虚拟列将失败。要么确保基列中的所有值都具有正确的日期时间文字格式。

另一种方法是创建 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 字段必须始终包含有效的日期字符串。

分享和享受。