2009-08-24 18 views
1

私はOracleで動作するこのクエリを持っていますが、Visual Studioでいくつかの問題があるため、Coalesceを使用するように変換します。Oracle SQLはcoalesceを使用します

SELECT * 
FROM a Left Join b on b.institution_code=a.institution_code 
WHERE 
     (upper(a.Login_Name)=UPPER('%' || :Login_Name || '%') OR :Login_Name IS NULL) 
    AND (upper(a.Display_Name) Like UPPER('%' || :Display_Name || '%') OR :Display_Name IS NULL) 
    AND (upper(a.Email_Address)=UPPER(:Email_Address) OR :Email_Address IS NULL) 
    AND ((a.institution_code=:institution_code) OR :institution_code IS NULL) 
    AND (upper(b.institution_desc) Like UPPER('%' || :institution_desc || '%') OR :institution_desc IS NULL) 

これは

WHERE 
Upper(a.Display_Name) LIKE Upper('%' || COALESCE(:Display_Name,a.Display_Name) || '%') 
AND upper(a.Login_Name)=Upper(COALESCE(:Login_Name,a.Login_Name))  
AND upper(a.Email_Address)=Upper(COALESCE(:Email_Address,a.Email_Address)) 

に動作しますが、私は、クエリからどんな結果を得ることはありませんCOALESCEを使用するinstitution_codeとinstitution_descフィールドを変換しようとします。

私はこれらの行を追加するとき

AND a.institution_code=COALESCE(:institution_code,a.institution_code) 
    AND (Upper(b.institution_desc) LIKE Upper('%' || COALESCE(:institution_desc,b.institution_desc) || '%')) 

答えて

0

私は問題は2行目(b.institution_desc)である疑いは結果がありません。具体的には、NULL LIKE NULLの可能性があり、NULL LIKE NULLはfalseを返します。

このようにそれを試してみてくださいする必要があります...

AND Upper(b.institution_desc) LIKE '%' || Upper(COALESCE(:institution_desc,b.institution_desc,'')) || '%' 
+0

申し訳ありませんが、これは機能しませんでした。 –

1
WHERE (UPPER(a.Login_Name) = UPPER('%' || :Login_Name || '%') OR :Login_Name IS NULL) 

WHERE (:Login_Name IS NULL OR UPPER(a.Login_Name) = UPPER('%' || :Login_Name || '%')) 

あなたが最初のバインド変数を確認したい - そう、あなたは知っている前に、データの比較をやっていますとにかくすべてが欲しいということですクエリの中で最悪のパフォーマンスを得ています。

あなたは多数の列にUPPERを実行するつもりなら次に、 - それは最初に行わ持っている副問合せのファクタリングを使用します。parmeterはt.col =パラメータがNULLであるか、WHERE(

WITH upper_a AS (
SELECT a.pk, 
     UPPER(a.login_name) 'login_name', 
     UPPER(a.display_name) 'display_name', 
     UPPER(a.email_address) 'email_address', 
     UPPER(b.institution_desc) 'institution_desc' 
    FROM a) 
SELECT * 
    FROM A a 
    JOIN upper_a ua ON ua.pk = a.pk 
WHERE :Login_Name IS NULL OR ua.login_name = v_login_name 

Oracleは行いません。 )よく、オプションの値を持つパラメータにバインド変数を使用することで何も得られません。あなたが本当に使いたいのは、CONTEXT変数です(9iから利用可能です)。

+0

私たちはoracle 8i –

+0

を持っています。Drats - 9iまでサブクエリのファクタリングまたはコンテキスト変数を使用することはできません。しかし、インデックススキャンや不必要な全テーブルスキャンを行うために、オプションパラメータの場合はCOALESCEを使用しないことをお勧めします。 –

2
AND ((a.institution_code=:institution_code) OR :institution_code IS NULL) 

はa.institution_codeがnullで、IF

AND a.institution_code=COALESCE(:institution_code,a.institution_code) 

と等価ではない:institution_codeはNULL(または第二の部分が真であるため)、その後、最初の例では、真であるが、 2番目のものは(NULL = NULLが真ではないため)変換されません。

関連する問題