1

Oracle で動作するこのクエリがありますが、Visual Studio に問題があるため、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))

しかし、institution_codeとinstitution_descフィールドを変換してcoalesceを使用しようとすると、クエリから結果が得られません。

これらの行を追加しても結果はありません

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

3 に答える 3

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

と同等ではありません

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

IF a.institution_code IS NULL および :institution_code IS NULL の場合、最初の例は true になります (OR の 2 番目の部分が true であるため) が、2 番目の例はそうではありません (NULL=NULL が true でないため)。

于 2009-08-24T22:30:18.090 に答える
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 || '%'))

バインド変数 FIRST を確認する必要があります。そうしないと、とにかくすべてが必要であることを知る前にデータ比較を行ってしまいます。クエリから可能な限り最悪のパフォーマンスを得ています。

次に、多数の列で UPPER を実行する場合は、サブクエリ ファクタリングを使用して最初に実行します。

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 は WHERE (parmeter IS NULL OR t.col = parameter) をうまく処理できず、オプションの値を持つパラメーターにバインド変数を使用しても何も得られません。本当に使いたいのは CONTEXT 変数です (9i 以降で利用可能)。

于 2009-08-24T20:22:28.380 に答える
0

問題は 2 行目 ( ) にあると思われb.institution_descます。具体的には、 NULL LIKE NULL状況の可能性があり、 NULL LIKE NULLfalse を返します。

次のようにしてみてください。

AND Upper(b.institution_desc) LIKE '%' || Upper(COALESCE(:institution_desc,b.institution_desc,'')) || '%'
于 2009-08-24T20:19:54.670 に答える