【问题标题】:Need to convert the data type while inserting into the other table插入其他表时需要转换数据类型
【发布时间】:2022-01-02 16:26:59
【问题描述】:
CREATE TABLE tab1 
(
    e_id    VARCHAR2(255),
    e_date  VARCHAR2(255),
    t_ref_num  VARCHAR2(255),
    CONSTRAINT pk_tab1 PRIMARY KEY ( e_id )
);

INSERT INTO tab1 VALUES (1, '01-01-2000', 11);
INSERT INTO tab1 VALUES (2, '01-01-2001', 12);
INSERT INTO tab1 VALUES (3, '01-01-2002', 13);

CREATE TABLE tab2 
(
    e_id       NUMBER(20),
    e_date     DATE,
    t_ref_num  NUMBER(20),
    CONSTRAINT pk_tab2 PRIMARY KEY ( e_id )
);

我需要将它插入到tab2表中,并且需要根据tab2表数据类型转换数据类型。因为在 tab1 表中我总是会得到 varchar 数据类型,但是在插入 tab2 表时我必须对其进行类型转换并且必须插入正确的数据类型。我怎样才能做到这一点?

MERGE INTO tab2 tt
USING (SELECT
           e_id, e_date, _t_ref_num
       FROM tab1) t1 ON ( t2.e_id = t1.e_id )

WHEN MATCHED THEN  
    UPDATE
        SET tt.e_date = t1.e_date,
            tt.t_ref_num = t1.t_ref_num

WHEN NOT MATCHED THEN
    INSERT (e_id, e_date, t_ref_num)
    VALUES (t1.e_id, t1.e_date, t1.t_ref_num);

我只需要在合并语句中进行更改。

【问题讨论】:

  • 你只是有一点错别字。看看this。顺便说一句,更喜欢将日期值存储在 DATE 类型列中。
  • 嗨@Littlefoot。我都做了。到目前为止的故事看起来很漂亮,但产出的产品毫无意义。正如我已经告诉过的,有一些拼写错误,例如列 t_ref_num 不应以 _ 为前缀,表 tab2 应适当地使用别名,并且在提供的插入期间需要 TO_DATE 转换存储日期列的决定保持不变。
  • @Barbaros,感谢您不羞于回复。大多数人不会那样做。至于你的反对意见:_ 错字是一个小错误(从我的角度来看)。我不太明白tab2 表的别名有什么问题(MERGE 中的tt,对吗?),而在 INSERT 中根本不应该使用TO_DATE,因为目标列的数据类型是 VARCHAR2。如果关于 SO 的大多数问题看起来都像这样,我会非常高兴。
  • 谢谢你@Littlefoot 我很感激。 tab2(某处ttt2)的别名存在混淆,实际上只需将t2 替换为tt 就足够了。目标表(tab2)的e_date 列具有DATE 类型而不是VARCHAR2...
  • 啊,我现在明白了! t2 vs. tt ...对,我什至没有注意到,因为我正在编写自己的 MERGE 并避免它:) INSERT 仅用于 tab1; Vicky 已经说过她(我猜是“她”)不知道如何应用 TO_DATE(合并时)。好的,就我而言,就是这样。我希望你做得很好,顺便说一句:)

标签: sql oracle plsql


【解决方案1】:

USING 子句中这样做。

设置日期格式(以便您知道什么是什么;您不必这样做):

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

e_date 上使用带有适当格式掩码的TO_DATEt_ref_num 看起来像一个普通的整数,所以我只是 TO_NUMBER-ing 它。

SQL> MERGE INTO tab2 tt
  2       USING (SELECT e_id,
  3                     TO_DATE (e_date, 'dd-mm-yyyy') e_date,
  4                     TO_NUMBER (t_ref_num) t_ref_num
  5                FROM tab1) t1
  6          ON (tt.e_id = t1.e_id)
  7  WHEN MATCHED
  8  THEN
  9     UPDATE SET tt.e_date = t1.e_date, tt.t_ref_num = t1.t_ref_num
 10  WHEN NOT MATCHED
 11  THEN
 12     INSERT     (e_id, e_date, t_ref_num)
 13         VALUES (t1.e_id, t1.e_date, t1.t_ref_num);

3 rows merged.

结果:

SQL> select * from tab2;

      E_ID E_DATE      T_REF_NUM
---------- ---------- ----------
         3 01.01.2002         13
         1 01.01.2000         11
         2 01.01.2001         12

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多