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

Posted

技术标签:

【中文标题】如何在 SQL 中使用伪列更新列值【英文标题】:How to Update a column value with a pseudo column in SQL 【发布时间】:2018-11-23 14:14:10 【问题描述】:

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

我已经准备了这样的选择语句。 Create_TS 应更新为 Create_TS_NEW 仅适用于 CREATE_TS 具有 '%/%' 的行 我需要知道我是否可以使用 Create_TS_NEW

之类的伪列更新表中的这些行

【问题讨论】:

在使数据保持一致的最后,您要将列转换为 TIMESTAMP 数据类型,对吗? (请说“是”,请说“是”!)如果这样做,您将不会再遇到格式问题,尽管您需要更改插入到表中的代码(希望将其封装在某个存储过程中!) no no .. 我的 CREATE_TS 列数据类型将是 varchar 2 ...我只是将日期值的格式从 '/' 更改为 '-'格式。就是这样...... 我需要一个更新 sql,它可以用正确的格式更改正确的值 那么如何阻止其他人将格式错误的数据放入该列? 实际上该数据显示在一份报告中,该报告的表现不佳。所以它的客户要求正确显示。 :) 【参考方案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 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') ;

【讨论】:

我还在屏幕截图中使用 substr fn... 创建了 create ts new 列,以制作预期的格式。但我需要一个 update 语句,我可以用这个定义的列更新同一个表 只需将派生列放在更新语句中即可。 是的,有效...我在更新语句中使用了我自己的派生列,它有效...谢谢... :)

以上是关于如何在 SQL 中使用伪列更新列值的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件的更新sql 数据表中的列值?

如何使用 DB2 中表的列值更新 DB1 中表的列值?

mysql如何根据一列值更新另一列的值?

pl sql触发器如何比较触发器中的列值

如何使用 phpMyAdmin 中的 SQL 查询设置具有许多特殊字符的列值?

如何在 BigQuery 标准 SQL 中查询 Bigtable 列值?