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

Oracleで一意のインデックスを作成し、nullを無視するにはどうすればよいですか?

    これは、関数ベースのインデックスを使用して行うことができます。以下はNVL2()を利用しています ご存知のように、式がnullでない場合は1つの値を返し、nullの場合は別の値を返します。 CASE()を使用できます 代わりは。

    SQL> create table blah (name varchar2(10), email varchar2(20))
      2  /
    
    Table created.
    
    SQL> create unique index blah_uidx on blah
      2      (nvl2(email, name, null), nvl2(name, email, null))
      3  /
    
    Index created.
    
    SQL> insert into blah values ('APC', null)
      2  /
    
    1 row created.
    
    SQL> insert into blah values ('APC', null)
      2  /
    
    1 row created.
    
    SQL> insert into blah values (null, '[email protected]')
      2  /
    
    1 row created.
    
    SQL> insert into blah values (null, '[email protected]')
      2  /
    
    1 row created.
    
    SQL> insert into blah values ('APC', '[email protected]')
      2  /
    
    1 row created.
    
    SQL> insert into blah values ('APC', '[email protected]')
      2  /
    insert into blah values ('APC', '[email protected]')
    *
    ERROR at line 1:
    ORA-00001: unique constraint (APC.BLAH_UIDX) violated
    
    
    SQL>
    

    編集

    シナリオでは常に名前が入力されるため、必要なインデックスは次のようになります。

    SQL> create unique index blah_uidx on blah
      2      (nvl2(email, name, null), email)
      3  /
    
    Index created.
    
    SQL> 
    


    1. Sqlサーバー2008でnvarcharをbigintに変換します

    2. PostgreSQLでの1日の累積合計の計算

    3. どの階層モデルを使用する必要がありますか?隣接、ネスト、または列挙?

    4. 画像をデータベースBLOBに保存します。 dbからPictureboxに取得