【11】SAP ABAP性能優化 - SQL中CONCAT保留字符串拼接中的空格

1. CONCAT的問題

SAP的OPEN SQL中提供了豐富的字符串操作函數,其中較爲常用的是CONCAT關鍵字,通過CONCAT可以實現兩個字段字符串的拼接,但在拼接過程中,字符串間的空格會被“吃掉”,將拼接的結果組成一個完整連續的字符。

但很多情況下,我們是希望保留字段中的空格的,那麼如何實現呢?

結合上篇博客【10】SAP ABAP性能優化 - 在SQL語句中操作String查詢複合主鍵AWKEY中介紹的SQL中CONCA的用法,本文中將進一步介紹保留“空格”的方式。

2. 雙重REPLACE實現空格的保留

爲了保留空格,我們使用雙重replace的方式,其核心代碼如下:

示例代碼:

TYPES: BEGIN OF ts_doc_key,
         bukrs TYPE bkpf-bukrs,
         belnr TYPE bkpf-belnr,
         gjahr TYPE bkpf-gjahr,
       END OF ts_doc_key,
       BEGIN OF ts_doc_header,
         bukrs TYPE bkpf-bukrs,
         belnr TYPE bkpf-belnr,
         gjahr TYPE bkpf-gjahr,
         awtyp TYPE bkpf-awtyp,
         awsys TYPE bkpf-awsys,
         awkey TYPE bkpf-awkey,
       END OF ts_doc_header.

DATA: lt_doc_key TYPE SORTED TABLE OF ts_doc_key WITH UNIQUE KEY bukrs belnr gjahr.
DATA: lt_header1 TYPE STANDARD TABLE OF ts_doc_header WITH EMPTY KEY,
      lt_header2 TYPE STANDARD TABLE OF ts_doc_header WITH EMPTY KEY,
      lt_header3 TYPE STANDARD TABLE OF ts_doc_header WITH EMPTY KEY
      .

BREAK-POINT.

**********************************************************************
*  CONCAT - Keep Blank 
**********************************************************************
* prepare 10 document keys
SELECT bukrs,
       belnr,
       gjahr
  FROM bkpf
  WHERE ( awtyp = 'BKPF' OR awtyp = 'BKPFF') AND ( bukrs = '88' OR bukrs = 'AAA') AND awkey IS NOT INITIAL
   INTO TABLE @lt_doc_key   UP TO 10 ROWS.

* different result
SELECT  a~bukrs AS bukrs,
        a~belnr AS belnr,
        a~gjahr AS gjahr,
        a~awtyp AS awtyp,
        a~awsys AS awsys,
        a~awkey AS awkey,
        concat( concat( b~belnr , b~bukrs ), b~gjahr ) AS wrong_awkey,
        concat( b~belnr, replace( replace( concat( rpad( b~bukrs, 4, '*' ), b~gjahr  ),
                                          '*', ' + ' ),
                                 '+', ' ' ) )
               AS right_awkey
FROM bkpf AS a INNER JOIN @lt_doc_key AS b
  ON a~bukrs = b~bukrs AND a~belnr = b~belnr
WHERE a~awtyp = 'BKPF' OR a~awtyp = 'BKPFF'
INTO TABLE @DATA(lt_result).

* concat ( BUKRS, BELNR, GJAHR ) to join the composite key BKPF-AWKEY.
SELECT a~bukrs,
       a~belnr,
       a~gjahr,
       a~awtyp,
       a~awsys,
       a~awkey
  FROM bkpf AS a INNER JOIN @lt_doc_key AS b
    ON a~awkey = concat( b~belnr, replace( replace( concat( rpad( b~bukrs, 4, '*' ), b~gjahr  ),
                                                    '*', ' + ' ),
                                           '+', ' ' ) )
 WHERE a~awtyp = 'BKPF' OR a~awtyp = 'BKPFF'
  INTO TABLE @lt_header1.

BREAK-POINT.

可以看到單純CONCAT, 以及在拼接字符串時使用雙重REPLACE後,實現保留空格的對比效果。

3. 字符串操作函數彙總

SAP在OPEN SQL中提供了豐富的字符串操作函數,對於遇到的具體問題,可以參照下面的程序尋找合適的解決方案。

REPORT demo_sql_function_string.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.
    DELETE FROM demo_expressions.
    INSERT demo_expressions FROM TABLE @( VALUE #(
      ( id = 'X'
        char1 = ' 0123'
        char2 = 'aAaA' ) ) ).

    SELECT SINGLE
           char1 AS text1,
           char2 AS text2,
           CONCAT(            char1,char2 )     AS concat,
           CONCAT_WITH_SPACE( char1,char2, 1 )  AS concat_with_space,
           INSTR(             char1,'12' )      AS instr,
           LEFT(              char1,3 )         AS left,
           LENGTH(            char1 )           AS length,
           LOWER(             char2 )           AS lower,
           LPAD(              char1,10,'x' )    AS lpad,
           LTRIM(             char1,' ' )       AS ltrim,
           REPLACE(           char1,'12','__' ) AS replace,
           RIGHT(             char1,3 )         as right,
           RPAD(              char1,10,'x' )    AS rpad,
           RTRIM(             char1,'3' )       AS rtrim,
           SUBSTRING(         char1,3,3 )       AS substring,
           UPPER(             char2 )           AS upper
           FROM demo_expressions
           INTO @DATA(result).

    cl_demo_output=>display( result ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  demo=>main( ).

 

發佈了68 篇原創文章 · 獲贊 52 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章