如何在SQL中使用伪列更新列值

时间:2018-11-23 14:14:10

标签: sql oracle sql-update

我在oracle 12c db中有一张表,其中一列是 varchar2 数据类型,但是值采用 DATE 格式。由于某种错误,有两种不同类型的格式混合在一起。 基本上,我必须在那里更改格式,并使所有值相似。 正确的格式为“ 2018-11-21-02.57.26.00” ,但某些值如下所示:“ 11/21/2018 20:03:10.066414” 我们需要所有的值都应该像正确的格式一样。为此需要准备一份更新声明。

Sample

我已经像这样准备了select语句。仅对于CREATE_TS具有'%/%'的行, Create_TS 应该更新为 Create_TS_NEW 我需要知道是否可以使用伪列(如 Create_TS_NEW

)更新表中的那些行

enter image description here

1 个答案:

答案 0 :(得分:1)

首先尝试找出带有斜杠(/)的值,然后将其转换为日期格式。

     SELECT 
        CREATE_TS,
        CASE WHEN  INSTR(CREATE_TS,'/')>0 THEN TO_DATE(SUBSTR(CREATE_TS,1,19),'MM/DD/YYYY HH24:MI:SS') 
        ELSE TO_DATE(SUBSTR(CREATE_TS,1,19),'YYYY-MM-DD-HH24-MI-SS') end default_date_format,

        to_char(CASE WHEN  INSTR(CREATE_TS,'/')>0 THEN TO_DATE(SUBSTR(CREATE_TS,1,19),'MM/DD/YYYY HH24:MI:SS') 
        ELSE TO_DATE(SUBSTR(CREATE_TS,1,19),'YYYY-MM-DD-HH24-MI-SS') end,'YYYY-MM-DD-HH24-MI-SS') CREATE_TS_new 
    FROM Table_

只需将派生列放在update语句中,足以更新所需的格式。

Update Table_ set create_ts=
to_char(CASE WHEN  INSTR(CREATE_TS,'/')>0 THEN TO_DATE(SUBSTR(CREATE_TS,1,19),'MM/DD/YYYY HH24:MI:SS') 
        ELSE TO_DATE(SUBSTR(CREATE_TS,1,19),'YYYY-MM-DD-HH24-MI-SS') end,'YYYY-MM-DD-HH24-MI-SS') ;