我正在比较两个表数据并显示数据,如果使用c#application存在值不匹配。假设我有两个表table1
和table2
,我想比较列名{ {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)
答案 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不包含任何无法正确转换为数字的字符串。