如何使具有数据类型不匹配的列无效

Posted

技术标签:

【中文标题】如何使具有数据类型不匹配的列无效【英文标题】:How to invalidate that which column having data type mismatch 【发布时间】:2017-11-14 12:58:42 【问题描述】:

我有一个用户的一些记录的表和另一个空记录的表。我想将该表的数据从一个用户迁移到另一个,但我遇到了一个错误 ORA: 01722 因为目标表的数据类型略有不匹配。在不更改数据类型的情况下,我应该怎么做才能解决这个问题。 源表的数据类型是-

目标表说明-

在不同用户的两个表中,只有一列是不匹配的数据类型LOTFRONTAGE。源表中的数据类型为 varchar2,目标表中的数据类型为 Number

如何使数据类型不匹配的列无效

【问题讨论】:

您使用的是哪个版本的 Oracle? 【参考方案1】:
insert into md.house(ID,MSSUBCLASS,MSZONING,
                     LOTFRONTAGE ,LOTAREA,LOTSHAPE,LOTCONFIG,
                     NEIGHBORHOOD,CONDITION1,BLDGTYPE,OVERALLQUAL,
                     YEARBUILT,ROOFSTYLE,EXTERIOR1ST,MASVNRAREA)
 select ID,MSSUBCLASS,MSZONING
 --hier
       ,TO_NUMBER(LOTFRONTAGE),

        LOTAREA,LOTSHAPE,LOTCONFIG,NEIGHBORHOOD,CONDITION1,
        BLDGTYPE,OVERALLQUAL,YEARBUILT,ROOFSTYLE,
        EXTERIOR1ST,MASVNRAREA 
  from SYS.HOUSE_DATA;

【讨论】:

这个已经使用了但是没有运行,出错了。我想知道我们如何使数据类型不匹配的列无效 你会得到什么样的错误,我的意思是当你运行我给你的代码时 ORA:01722 无效号码 我认为你在 SYS.HOUSE_DATA 的 LOTFRONTAGE 字段中有像 +,/,# 这样的字符。我会通过将 LOTFRONTAGE 转换为 varchar2 来检查 md.house 的表定义,就像在 SYS.HOUSE_DATA 中一样。 或尝试从无效数据集中过滤来自 SYS.HOUSE_DATA 的数据【参考方案2】:

如何使数据类型不匹配的列无效。

使列无效是什么意思? Oracle 中没有此类工具可供您使用。

您所能做的就是尝试识别 LOTFRONTAGE 中的非数字字符。运行此查询以查找哪些值是非数字的。

SELECT 
        ID, 
        LOTFRONTAGE 
FROM 
        yoursourcetable
WHERE   REGEXP_LIKE(LOTFRONTAGE, '[^0-9]+');

获得 id 和列值后,您可以更新这些值或在插入中替换它们。

update yoursourcetable SET LOTFRONTAGE = <numeric_value> 
where ID = <id> and  LOTFRONTAGE = '<non-numeric value>;

然后运行INSERT

INSERT INTO yourdesttable 
        (col1,col2... 
        ) 
SELECT ID, REPLACE (LOTFRONTAGE ,<non-numeric>,<numeric>),... from yoursourcetable ;

【讨论】:

以上是关于如何使具有数据类型不匹配的列无效的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有数字值的 char 数据类型的列转换为数字数据类型

mybatis插入数据传入值为null时提示无效的列类型

如何在 oracle 中创建具有对象数据类型的列

如何在 SQLmap 中转储没有数据类型的列?

PySpark:如何将具有 SparseVector 类型的列的 Spark 数据帧写入 CSV 文件?

TypeError:数组 dtype 和格式说明符不匹配。如何将具有不同值类型的数据框保存为 txt 文件?