从VARCHAR字段复制到NUMBER字段,以便在将VARCHAR值复制到NUMBER字段后变为空

时间:2018-07-30 16:03:40

标签: oracle

我有两个表 Table1 Table2 ,它们的TestResult和Testcounts列均相同。 表1 的测试结果为varchar,而表2 的测试结果为数字。 我有一个字符串。例如,“ Oracle”作为 Table1 的varchar类型的testresult的值,需要将其插入到 Table2 的数字类型的testresult中,作为null。我这样做吗?任何建议将不胜感激:)

编辑

我有table1,其中列作为TestResult varchar2(50),Testcount的值分别为“ 0.5”,“ 0.6”,“ 0.8”,“ Oracle”,TestResult为1,2,3,4。 >

现在我有另一个表Table2作为TestResult号和Testcount号,没有值,换句话说,它是空的。我想将所有表1中的数据插入到表2中,并将“ Oracle”插入为“空”

2 个答案:

答案 0 :(得分:2)

以下内容将满足您的要求:

INSERT INTO TABLE2 (TESTRESULT, TESTCOUNTS)
  SELECT CASE
           WHEN LENGTH(REGEXP_SUBSTR(TESTRESULT, '[0-9.]*')) = LENGTH(TESTRESULT) THEN TESTRESULT
           ELSE NULL
         END,
         TESTCOUNTS
    FROM TABLE1

SQLFiddle here

答案 1 :(得分:0)

如果只有一个不能转换为数字的字符串值,并且要将其设置为null,则可以使用case表达式提供null:

insert into table2 (testresult, testcounts)
select case when testresult = 'Oracle' then null else to_number(testresult) end,
  testcounts
from table1;

演示:

create table table1 (testresult varchar2(10), testcounts number);

insert into table1
select '0.5', 1 from dual
union all select '0.6', 2 from dual
union all select '0.8', 3 from dual
union all select 'Oracle', 4 from dual;

create table table2 (testresult number, testcounts number);

insert into table2 (testresult, testcounts)
select case when testresult = 'Oracle' then null else to_number(testresult) end,
  testcounts
from table1;

select * from table2;

TESTRESULT TESTCOUNTS
---------- ----------
        .5          1
        .6          2
        .8          3
                    4

db<>fiddle

如果您使用的是Oracle 12c第2版(或更高版本),则也可以尝试将字符串转换为数字,并使用default ... on conversion error子句替换该null或任何其他非数字值:

insert into table2 (testresult, testcounts)
select to_number(testresult default null on conversion error), testcounts
from table1;

select * from table2;

TESTRESULT TESTCOUNTS
---------- ----------
        .5          1
        .6          2
        .8          3
                    4

在早期版本中,您可以使用用户定义的函数执行相同的操作,该函数包装实际的to_number()调用并在错误时返回null。或类似于@BobJarvis显示的正则表达式/翻译检查。

具有多行为null的行虽然会使数据难以解释,所以希望您只有这个固定值...