是否有SQL的JDFTVAL等价物?

时间:2013-01-28 13:15:09

标签: db2 ibm-midrange rpgle

对于Iseries / IBMi DB2。

我一起加入多个文件/表格。

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

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

另一方面,在我使用NULLs之前,SQL视图已IFNULL( MBRDESCR, '')。但现在MBRDECSRVARCHAR。这是不可接受的。

那么如何在没有NULLsVARCHARs

的情况下创建SQL连接

请求的示例代码:

DDS:

                                            JDFTVAL                                              
                R TRANSR                    JFILE(TRANSPF MBRPF)                                

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

SQL:

CREATE VIEW TRANSV01 AS (                 
    SELECT TRANSID                                 ,
           MBRID                                   ,                 
           CAST(IFNULL(MBRNAME  , '') as Char(20)) ,                 
           CAST(IFNULL(MBRSURNME, '') as Char(25))                  
    FROM TRANSPF
    --Member Name                                                               
    LEFT OUTER JOIN MBRPF on MBRID = MBRID     
) RCDFMT TRANSR;                                                             

请注意以下事项:

  1. 以上示例简化

  2. 并非每个TRANSPF中的MBRID在MBRPF中都有相应的条目(即没有参考约束)。因此,当MBRPF连接到TRANSPF时,MBRNAME,MBRSURNME中将存在NULL值。除非使用JDFTVAL或IFNULL()。

  3. 由于性能和rpgle中的extname(),我不想拥有VARCHAR。

  4. 我不想拥有NULL值,我不希望pgm必须处理它们。

1 个答案:

答案 0 :(得分: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;