2016-06-01 10 views
2

私はOracle decode() documentationを読んでいました。私が知る限り、decode(expr, search1, value1, search2, value2...)を呼び出すとexprsearch2およびsearch3がタイプsearch1にキャストされ、比較されます。検索がnullの場合のoracleでのデコードの動作

search1NULLの場合、search2search3などはどのようにキャストされますか?

create table sc(a date, b varchar2(256)); 

insert into sc values(
    to_date('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss'), 
    '2010-01-01 11:22:33' 
); 

select decode(
     to_date('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss'), 
     null, 
     1, 
     b, 
     123, 
     a, 
     456 
     ) 
from sc; 

なぜ結果456よりもむしろ123はいかがですか?

+0

を、デコードされ、 "A" とそれにマッチします日付です。デコードが何をしようとするのかをよりよく理解するために、これを "ケース... ... then ... when .. then .. end"と書き直そうとすることができます。ほとんどの場合、デコードはこのようには使用されませんが、これは次のようになります。 "decode(myint、1、 'one'、2、 'two')" – LukStorms

+0

あなたのようなもの。私たちがdecode(1、null、22、 '1'、33、1、44)を呼び出すと、33ではなく44が得られます。 – yemsmvp

+0

本当にありがとうございますか? SELECT DECODE(1、NULL、1、33、 '1'、44)DUAL出力からではない33 – yemsmvp

答えて

3

EDIT:と比較する最初の値がNULLまたはcharである場合 、すべての値がVARCHAR2に変換され、文字列として比較します。だから、常に同じタイプを比較して、文字列を比較していない場合は最初の値を比較としてnullを使用していません:NULLである

select decode(
     to_date('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss'), 
     to_date('2010-01-01 11:22:31', 'yyyy-mm-dd hh24:mi:ss'), 
     0, 
     null, 
     1, 
     to_char(to_date('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss')), 
     2, 
     to_date(b, 'yyyy-mm-dd hh24:mi:ss'), 
     123, 
     a, 
     456 
     ) 
from sc; 

最初の値を比較すると、日付はデフォルトの日付表​​現を文字列に変換されます(これはb)ではこれと異なることがあり、bと比較することができる。最初の結果は、データ型CHARを持っているか、最初の結果は、Oracle、その後、 nullの場合ならば

:私たちは、Oracleのマニュアルを読めば

select to_char(to_date('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss')),b from sc 

:デフォルトを確認したい場合は、これを使用戻り値をデータ型VARCHAR2に変換します。

同じことが値で発生します。最初の値がnullの場合、すべてがstringに変換されます。ここを見ることができます。

SELECT DECODE (1, NULL, 1, '01', 2, '1 ', 3, '1', 4, 1, 5) FROM DUAL; 

今、この与える何番

SELECT DECODE (1, 5, 1, '01', 2, '1 ', 3, '1', 4, 1, 5) FROM DUAL; 

でヌルを変更:最初の値が日付であるため、

SELECT DECODE (TO_DATE ('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss'), 
       NULL, 1, 
       TO_DATE ('2010-01-01 15:22:32', 'yyyy-mm-dd hh24:mi:ss'), 2, 
       '3') 
FROM DUAL 
+0

本当に本当に役立ちます。本当にありがとう。 – yemsmvp

1

あなたにそれを見つけるフィールドに1を見つけ、デフォルトのために行くことができない、ので

SELECT DECODE(1, NULL, 1, 33, '1', 44) FROM DUAL; 

はあなたに44を与えるより良い理解を得ました。

(1,    -> Search expression 
NULL, 1,   -> Find and replace 
33, 1,    -> Find and replace 
44)    -> default 

44 

また

SELECT DECODE(1, NULL, 22, 1, 33, '1', 44) FROM DUAL; 

それを見つけるフィールドに1を検索し、置き換える値のために行く、ので、あなたに(33)33を与えるだろう。

(1,    -> Search expression 
NULL, 22,   -> Find and replace 
1, 33,    -> Find and replace 
1, 44)   -> Find and replace and no default 

33 

また

SELECT DECODE(1, NULL, 22, 1, 33, '1', 44) FROM DUAL; 

それを見つけるフィールドに1を検索し、存在していないデフォルトのために行くことができない、ので、あなたにNULLを与えるだろう。

(1,    -> Search expression 
NULL, 22,   -> Find and replace 
2, 33,    -> Find and replace 
2, 44)   -> Find and replace and no default 

(null) 
+0

thx。ええ。これは理解しやすい。私はそれを知っていました。私の質問は、search1がnullの場合、どのキャストタイプが使用されますか?どのようにそれを決定する?別の言葉では、2つのオペランドが異なるデータ型であるときに、等しいかどうかを決める方法は? thx – yemsmvp

関連する問題