如何在 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 中使用伪列更新列值的主要内容,如果未能解决你的问题,请参考以下文章