1

对于 Iseries/IBMi DB2。

我将多个文件/表连接在一起。

我已经在 DDS 和 SQL 中编写了代码。

DDS 逻辑文件完全按预期工作,但我不能将它用于 rpgle 中的嵌入式 sql,因为它默认为 SQE 引擎,从而导致可怕的性能。

另一方面,SQL 视图在NULLs我使用IFNULL( MBRDESCR, ''). 但现在MBRDECSR是一个VARCHAR。这是不可接受的。

那么如何在没有NULLsand的情况下创建 SQL 连接VARCHARs

要求的示例代码:

DDS:

                                            JDFTVAL                                              
                R TRANSR JFILE(TRANSPF MBRPF)                                

                J 加入(1 2)
                                            JFLD(MBRID MBRID)                                  
      *                                                
                  TRANSID JREF(1)     
                  MBRID JREF(1)                               
                  MBRNAME JREF(2)                               
                  MBRSURNME JREF(2)                               
      *                   
                K TRANSID                                                       
                K MBRID

SQL:

创建视图 TRANSV01 为 (                 
    选择 TRANSID ,
           ,                 
           CAST(IFNULL(MBRNAME , '') as Char(20)) ,                 
           CAST(IFNULL(MBRSURNME, '') as Char(25))                  
    来自 TRANSPF
    - 成员名字                                                               
    MBRID 上的左外连接 MBRPF = MBRID     
) 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

假设它是您认为不受欢迎的“允许空值”,请使用 UNION。第一个 SELECT 选择所有匹配的行,这将为您设置 NOT NULL 属性。第二个 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 回答