sql >> データベース >  >> RDS >> Oracle

Oracle PL/SQL文字列比較の問題

    Philが指摘したように、空の文字列はNULLとして扱われ、NULLは何にも等しくも等しくもありません。空の文字列またはNULLが予想される場合は、NVL()でそれらを処理する必要があります。 :

     DECLARE
     str1  varchar2(4000);
     str2  varchar2(4000);
     BEGIN
       str1:='';
       str2:='sdd';
    -- Provide an alternate null value that does not exist in your data:
       IF(NVL(str1,'X') != NVL(str2,'Y')) THEN
        dbms_output.put_line('The two strings are not equal');
       END IF;
     END;
     /
    

    ヌル比較について:

    NULLSに関するOracle12cのドキュメントによると、IS NULLを使用したnull比較 またはIS NOT NULL TRUEに評価してください またはFALSE 。ただし、他のすべての比較はUNKNOWNと評価されます 、ない FALSE 。ドキュメントにはさらに次のように記載されています:

    UNKNOWNと評価される条件は、ほとんどFALSEのように機能します。たとえば、WHERE句にUNKNOWNと評価される条件を持つSELECTステートメントは、行を返しません。ただし、UNKNOWNに評価される条件は、UNKNOWN条件評価に対する以降の操作がUNKNOWNに評価されるという点で、FALSEとは異なります。したがって、NOT FALSEはTRUEと評価されますが、NOTUNKNOWNはUNKNOWNと評価されます。

    参照表はOracleから提供されています:

    Condition       Value of A    Evaluation
    ----------------------------------------
    a IS NULL       10            FALSE
    a IS NOT NULL   10            TRUE        
    a IS NULL       NULL          TRUE
    a IS NOT NULL   NULL          FALSE
    a = NULL        10            UNKNOWN
    a != NULL       10            UNKNOWN
    a = NULL        NULL          UNKNOWN
    a != NULL       NULL          UNKNOWN
    a = 10          NULL          UNKNOWN
    a != 10         NULL          UNKNOWN
    

    また、空の文字列が常にNULLと評価されると仮定してPL/SQLを記述すべきではないことも学びました。

    Oracle Databaseは現在、長さがゼロの文字値をnullとして扱います。ただし、これは将来のリリースでは引き続き当てはまらない可能性があるため、空の文字列をnullと同じように扱わないことをお勧めします。



    1. データベーステーブルからのランダムレコード(T-SQL)

    2. PostgreSQLでの重複更新時に挿入しますか?

    3. SQLServerの@@MAX_PRECISIONとは何ですか?

    4. SQL Serverで日時を切り捨てるにはどうすればよいですか?