5

トニー・アンドリュースは別の質問で次の例を挙げました:

IF p_c_courtesies_cd 
   || p_c_language_cd 
   || v_c_name 
   || v_c_firstname 
   || v_c_function 
   || p_c_phone 
   || p_c_mobile p_c_fax 
   || v_c_email is not null
THEN
     -- Do something
END IF;

Oracle COALESCE 関数の巧妙な (少しあいまいではないにしても) 代替手段として。案の定、それは機能します。いずれかの引数が null でない場合、IF テストは true です。私の質問: 上記の連結操作の Oracle の実装は SQL-92 に準拠していますか? NULL を含む式は NULL に評価されるべきではありませんか? そう思わないのなら、なぜ式 1 + NULL が NULL と評価されなければならないのでしょうか?

4

5 に答える 5

3

いいえ、Oracle のヌルの扱いは独特で、他のすべてのものとは異なり、ANSI 標準と矛盾しています。しかし、オラクルの弁護では、一貫性のある ANSI 標準が存在するずっと前に、オラクルはおそらくこの扱いに落ち着き、コミットしていたのです!

それはすべて、Oracle が文字数の後に文字列データが続く文字列を格納するという事実から始まります。NULL は、後続の文字列データがないゼロの文字数で表されます。これは、空の文字列 ('') とまったく同じです。オラクルには、それらを区別する方法がありません。

これは、この連結の場合のように、いくつかの風変わりな動作につながります。Oracle には文字列の長さを返す関数 LENGTH もありますが、これは逆の方法で定義されているため、LENGTH('') はゼロではなく NULL を返します。そう:

LENGTH('abc') + LENGTH('') IS NULL

LENGTH('abc' || '') = 3

これは基本的な数学的原理に違反しているように私には思えます。

もちろん、オラクルの開発者はこれに慣れすぎて、私たちの多くはそれについて間違っていることや奇妙なことに気付くことさえできませ.もの!

于 2009-01-21T11:06:39.337 に答える
2

@Nezroy:リンクをありがとう。しかし、私がこの規格を読んでいると、Oracleの実装は実際には正しくないと述べていると思います。セクション6.13、一般規則、項目2a:

     2) If <concatenation> is specified, then let S1 and S2 be the re-
        sult of the <character value expression> and <character factor>,
        respectively.

        Case:

        a) If either S1 or S2 is the null value, then the result of the
          <concatenation> is the null value.
于 2009-01-20T19:15:29.893 に答える
1

DCookie によって強調されたSQL-92仕様の部分と他の DB の動作に基づいて、Oracle は連結演算子で標準に準拠していないと思います。

オラクル(tuinstoelの答えから):

SQL>  select 'something'||null from dual;

'SOMETHIN
---------
something

MSSQL:

SELECT 'something'+NULL;

NULL

PostgreSQL:

postgres=# \pset null '(null)'
Null display is "(null)".
postgres=# select 'something'||null as output;
 output
--------
 (null)
(1 row)

MySQL:

mysql> select concat('something',NULL) as output;
+--------+
| output |
+--------+
| NULL   |
+--------+
1 row in set (0.00 sec)
于 2009-01-20T20:06:19.683 に答える
0
SQL>  select 'something'||null from dual;

'SOMETHIN
---------
something

null を使用した文字列連結は null にはなりません。私はこれが正常な動作だと思います、私はそれに慣れています。他に何を言うべきかわかりません。

于 2009-01-20T18:46:24.167 に答える