如何在两个表

时间:2016-05-14 11:48:21

标签: c# asp.net oracle oracle-sqldeveloper

我正在比较两个表数据并显示数据,如果使用c#application存在值不匹配。假设我有两个表table1table2,我想比较列名{ {1}} Leaf integer table1 varchar table2如果不匹配,我会将数据从table2推送到table1我正在动态生成oracle查询的where子句,就像

if(changevalue=`Leaf`)
{
expression+=" AND NVL(table2.Leaf,'0') != NVL(table1.Leaf,0) and table2.Leaf is not null"
}

但是大多数时候我在执行查询时会遇到异常,例如"无效的数字"。如何解决这个问题?

修改

我确实喜欢to_number (table2.Leaf) != table1.Leaf and table2.Leaf is not null,但有时我也会遇到异常(无效的数字).table2.Leaf的类型为NUMBER(10),table1.Leaf的类型为VARCHAR2(30)

2 个答案:

答案 0 :(得分:2)

你可以做很多事情,首先是在oracle中创建一个名为isNum的PLSQL函数,它试图将varchar值转换为数字并捕获异常以返回'N ”。

CREATE OR REPLACE FUNCTION isNum( strVal IN VARCHAR2 )
  RETURN VARCHAR2
IS
  num NUMBER;
BEGIN
  num := to_number(strVal);
  RETURN 'Y';
EXCEPTION
  WHEN others THEN
    RETURN 'N';
END isNum;

另一种方法是使用REGEXP_LIKE

select case when REGEXP_LIKE (Leaf,'^[[:digit:]]+$') then Leaf else 0 end as Leaf
from Table;

答案 1 :(得分:1)

一些事情。

... and NVL(table2.Leaf,'0') != NVL(table1.Leaf,0) and table2.Leaf is not null

太过分了。要使此条件成立,table2.Leaf不能为null。如果它实际上不是null,那么您不需要将其包装在NVL中。然后你不需要检查table1.Leaf为null,因为null永远不会计算等于非空值。所以这个复合条件相当于

... and table2.Leaf != table1.Leaf

(你甚至不需要检查table2.Leaf是否为null;如果至少有一个术语为null,则!=永远不会求值为真。)

其次,您尝试将字符串与数字进行比较,没有显式强制转换。这绝不是一个好主意。你用c#编码,所以你知道。也许最简单的方法是将数字转换为字符串。但是你需要注意格式,因为 - 例如 - 某些标准格式在数字的左边添加一个空格(如果数字是负数,则为减号保留空间)。此外,您的号码可能是2,但table1中存储的字符串可能是2.00。因此,最好将字符串文字转换为数字,但必须确保table1.Leaf中的值是合法数字。

... and to_number(table2.Leaf) != table1.Leaf

可能就是你所需要的,如果你很幸运,table1.Leaf不包含任何无法正确转换为数字的字符串。