2016-05-14 4 views
0

2つのテーブルのデータを比較し、値が一致しない場合はデータを表示していますか?table1table2とi私は.Iは2つのテーブルで異なるデータ型を持つデータに対してnullをチェックする方法

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

しかし、のようなものである動的オラクルクエリのwhere句を生成していますtable2からtable1にデータをプッシュします不一致がある場合は、列名table1integertable2varcharあるLeafを比較したいですほとんどの時間e「無効な番号」などのクエリを実行中に例外が発生するこの問題を解決するにはどうすればよいですか?私はTO_NUMBER (table2.Leaf) != table1.Leaf and table2.Leaf is not nullが、私は例外を取得していますまだいくつかの回(無効な番号).table2.Leafの型がNUMBER(10)であり、table1.LeafがVARCHAR2型である(30のようでした

EDIT

答えて

2

isNumなどと呼ばれるPLSQL関数を作成することもできます.Oracleでは、varchar値を数値に変換して例外をトラップして 'N'を戻そうとします。

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

これは簡単な方法ですか? – peter

+0

最後のオプションは最も簡単な方法です。最初のオプションは、私が推測するように、わかりやすく最も再利用可能な方法です。 – gmiley

+0

ええ、私はどこの句がチェックボックスの選択に基づいて動的に作成されているのC#アプリケーションを使用して、なぜ私は尋ねた – peter

1

いくつかのことを:

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を使用することです。

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

過剰です。この条件をtrueにするには、table2.Leafをnullにすることはできません。実際にnullでない場合は、NVL内でラップする必要はありません。そして、nullがnull以外の値と等しくないと評価することはないので、table1.Leafにnullをチェックする必要はありません。 (あなたも、nullをtable2.Leafをチェックする必要はありません!;用語の少なくとも一方がnullの場合= trueと評価されたことがない)ので、この化合物の状態が

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

に相当します。

第2に、文字列を数字と比較しようとしていますが、明示的なキャストはありません。それは決して良い考えではありません。あなたはc#でコード化しているので、あなたはそれを知っています。おそらく、最も簡単なのは数字を文字列にキャストすることです。しかし、フォーマットには注意が必要です。たとえば、標準フォーマットのいくつかは、数字の左側にスペースを追加します(数字が負の場合はマイナス記号のためのスペースを予約します)。また、あなたの番号は2かもしれませんが、table1に格納されている文字列は2.00かもしれません。実際には文字列リテラルを数値にキャストする方が良いですが、table1.Leafの値が正当な数値であることを確認する必要があります。運がよけれとtable1.Leafが正しく数値に変換することができない任意の文字列が含まれていない場合

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

は、あなたが必要とするすべてのかもしれません。

+0

to_number(table1.Leaf)またはto_number(table2.Leaf)?? table2にはvarcharが含まれています – peter

+0

申し訳ありませんが、私はそれらを誤って切り替えました。 – mathguy

+0

私はto_number(table2.Leaf)!= table1.Leafとtable2.Leafはnullではありませんが、何度か例外が発生しました(無効な番号).table2.LeafはNUMBER(10)とtable1.LeafですタイプVARCHAR2(30) – peter

関連する問題