如何使具有数据类型不匹配的列无效
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 数据类型的列转换为数字数据类型