2017-09-12 3 views
1

I "フィールド1の値がフィールド2の値が等しくない場合は行を返すために、Oracle SQLでクエリを記述しようとしているメートル(フィールド2は、いくつかのNULL値を含む場合)SQLは、いくつかのNULLでフィールドを比較

の場合私はこのクエリを使用する場合の表は、この

Field1 Field2 
1   1 
2   3 
4   

次のようになります。

select * from table where field1 != field2 

Iのみ行2取り戻すではなく、私は両方の行を取得するために使用できる単一のクエリがあります3行2 、3人が逮捕されたか?

+1

ORACEは3つの値論理を使用しています - http://www.oracle.com/technetwork/issue-archive/2005/05-jul/o45sql-097727.html –

+0

あなたが含ままたは行を除外したいですか両方のフィールドがnullの場合 – mathguy

+0

@mathguyは、両方がヌルであるときに除外されます。なぜなら、それらは事実上等価であるからです(私は彼らが両方ともヌルであると確信しているわけではありませんが、それは十分です)。 – Jonjilla

答えて

5

field2NULLの場合も含まれます。あなたはnullがマッチではなく、それを表示したいことを知っています。

SELECT * FROM table 
WHERE field1 != field2 
    OR (field1 IS NULL AND field2 IS NOT NULL) 
    OR (field1 IS NOT NULL AND field2 IS NULL) 

また、あなたは別の値としてnullを主張するCOALESCEを使用することができます。この場合は0を使用しました。 field1またはfield2に0がない場合にのみ0を使用してください。基本的にあなたのテーブルにはない値を選択してください。

select * from table where COALESCE(field1, 0) != COALESCE(field2, 0) 

編集:OPは、field1がnullである可能性があると主張し、最初のクエリを変更しました。クエリ1は何が起こっているかについてもう少し明確であり、クエリ2は同じ最終結果を達成するためのより簡潔な方法です。

もっとここで読む:COALESCE Function in TSQL

また、しかし、それは私の理解にはあまり効率的で、COALESCEようNULLに対処するNVL()を使用することができます。さらに詳しい情報:は(あなたがコメントで示されているように)両方のフィールドがnullある行を除外するために必要であればOracle Differences between NVL and Coalesce

+0

これは必要ですか?それらのうちの1つがnullの場合、field1は= field2ではないことは明白ではありませんか? – Jonjilla

+0

これは気にされていませんが、NULLであるか、field1がNULLでfield2がnullでない場合は処理されません。しかし、COALESCE編集は行います。 –

+1

@Jonjilla誰かがこれに答えてくれると確信しています...しかし、「NULL」は比較できる値ではありません。文字通り価値の欠如です。存在するものと存在しないものとを比較しています。存在する2つのものを比較しない。 – justiceorjustus

0
select * 
    from table 
where field1 != field2 
    or (field1 IS NOT NULL AND field2 IS NULL) 
    or (field1 IS NULL AND field2 IS NOT NULL) 
0

、その後、あなたはこれが独特の利点を取る

select * 
from <table> 
where decode(field1, field2, 1, 0) = 0 
; 

使用することができますdecodeの定義。 nullnullの「適切な」処理とは異なります)の場合は、field1 = field2およびALSOの場合は3番目の引数(この例では1)を返します。それ以外の場合は0を返します。これはあなたが望むものです。

select * from table where field1 != nvl(field2,-field1); 

は、それはあなたのために[OK]を動作するかどうか、私たちは知ってみましょう:

0

こんにちは、いくつかの正しい答えはすでにここが、ここであなたがより良いようなことがあり、別のものです。それ以上の明確化のために私に再度尋ねるのをためらうことはありません。

テッド

+0

この解決策は間違っています(OPの「等しくない」という定義を考慮して)。実際に、field1がNULLだがfield2が** not ** NULLの場合、その行は含まれません。しかし、OPはそれを望んでいた。 – mathguy

関連する問題