如何创建一个填充查询结果的新列?
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
字段必须始终包含有效的日期字符串。
分享和享受。
我有一个 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
字段必须始终包含有效的日期字符串。
分享和享受。