1

Iseries/IBMi DB2 用。

複数のファイル/テーブルを結合しています。

私は DDS と SQL の両方でコードを書きました。

DDS 論理ファイルは期待どおりに機能していますが、デフォルトで SQE エンジンが使用されるため、rpgle に埋め込まれた SQL には使用できず、パフォーマンスが大幅に低下します。

一方、SQL ビューは、NULLs私が使用するまではIFNULL( MBRDESCR, ''). しかし、今MBRDECSRVARCHARです。これは受け入れられません。

NULLsでは、 andなしで SQL 結合を作成するにはどうすればよいVARCHARsでしょうか。

要求されたサンプル コード:

DDS:

                                            JDFTVAL                                              
                R TRANSR JFILE(TRANSPF MBRPF)                                

                J JOIN(1 2)
                                            JFLD(MBRID MBRID)                                  
      *                                                
                  トランシッド JREF(1)     
                  MBRID JREF(1)                               
                  MBRNAME JREF(2)                               
                  MBRSURNME JREF(2)                               
      *                   
                Kトランシッド                                                       
                K MBRID

SQL:

ビュー TRANSV01 を作成 (                 
    TRANSID を選択します。
           MBRID 、                 
           CAST(IFNULL(MBRNAME , '') as Char(20)) ,                 
           CAST(IFNULL(MBRSURNME, '') as Char(25))                  
    TRANSPFから
    - メンバー名                                                               
    MBRID = MBRID の LEFT OUTER JOIN MBRPF     
) RCDFMT TRANSR;                                                             

次の点に注意してください:

  1. 上記の例は単純化されています

  2. TRANSPF のすべての MBRID が MBRPF に対応するエントリを持っているわけではありません (つまり、参照制約はありません)。したがって、MBRPF が TRANSPF に結合されると、MBRNAME、MBRSURNME に NULL 値が存在します。JDFTVAL または IFNULL() が使用されていない場合。

  3. rpgle でのパフォーマンスと extname() のため、VARCHAR は使用しないほうがよいと思います。

  4. 私は NULL 値を持ちたくないので、pgm でそれらを処理する必要はありません。

4

1 に答える 1

0

望ましくないのは「null値を許可する」と仮定して、UNIONを使用します。最初の SELECT は、一致するすべての行を選択します。これにより、NOT NULL プロパティが設定されます。2 番目の SELECT は、一致しないすべての行を選択します。これらの行にはフィラー フィールドを指定します。

CREATE VIEW TRANSV01 AS (                 
    SELECT TRANSID                                 ,
           MBRID                                   ,                 
           MBRNAME  ,
           MBRSURNME
    FROM TRANSPF
    --Member Name                                                               
    JOIN MBRPF on MBRID = MBRID     
  UNION
    SELECT TRANSID                                 ,
           MBRID                                   ,                 
           CAST('') as Char(20)) ,                 
           CAST('') as Char(25))                  
    FROM TRANSPF
    --Member Name                                                               
    EXCEPTION JOIN MBRPF on MBRID = MBRID     
) RCDFMT TRANSR;                                             
于 2013-01-28T15:55:31.310 に答える