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( ).