본문 바로가기
ABAP/Syntax

[OpenSQL] OpenSQL Expressions

by name_text 2023. 7. 19.

OpenSQL Expressions

ABAP New syntax의 Open SQL에서 처리할 수 있는 표현식이 Native 못지 않게 상당히 많이 늘어나서

이제 ABAP 영역에서 처리하던 작업을 쿼리문을 통해 데이터베이스 영역에서 처리하여 성능 향상 시킬수 있습니다

 

자세한 내용은 T-Code : ABAPDOCU 에서 확인 할 수 있습니다

 

아래는 제 개인적인 기준으로 자주 사용하고 있는 SQL Functions 입니다.

 

이외에도 && 을 이용한 문자열 결합, coalesce 을 이용한 null 대체 등

더 많은 내용은 위의 ABAPDOCU에서 사용법을 확인하여 적절히 활용하시면 좋습니다.

 

#1. SQL Numeric Functions

사용 예시

TYPES: BEGIN OF T_TMP,
  SQL_EXP1 TYPE P LENGTH 8 DECIMALS 5,
  SQL_EXP2 TYPE P LENGTH 8 DECIMALS 5,
  SQL_EXP3 TYPE I,
  SQL_EXP4 TYPE I,
  END OF T_TMP.

DATA LT_TMP TYPE STANDARD TABLE OF T_TMP.

LT_TMP = VALUE #( ( SQL_EXP1 = '123.45678'    SQL_EXP2 = '11.00000'     SQL_EXP3 = 7    SQL_EXP4 = 3 )
                  ( SQL_EXP1 = '123.56789'    SQL_EXP2 = '11.55670'     SQL_EXP3 = 3    SQL_EXP4 = 7 )
                  ( SQL_EXP1 = '123.99999'    SQL_EXP2 = '11.95670'     SQL_EXP3 = 10    SQL_EXP4 = 2 )
                  ( SQL_EXP1 = '-123.45678'   SQL_EXP2 = '11.00000'     SQL_EXP3 = -7   SQL_EXP4 = 3 )
                  ( SQL_EXP1 = '-123.56789'   SQL_EXP2 = '-11.55670'    SQL_EXP3 = 3    SQL_EXP4 = -7 )
                  ( SQL_EXP1 = '123.99999'    SQL_EXP2 = '-11.95670'    SQL_EXP3 = -10   SQL_EXP4 = -2 ) ).

SELECT
  SQL_EXP1, SQL_EXP2,
  ABS( SQL_EXP1 ) AS ABS_EXP1,
  ABS( SQL_EXP2 ) AS ABS_EXP2,
  CEIL( SQL_EXP1 ) AS CEIL_EXP1,
  CEIL( SQL_EXP2 ) AS CEIL_EXP2,
  DIVISION( SQL_EXP1, SQL_EXP2, 1 ) AS DIVISION,
  FLOOR( SQL_EXP1 ) AS FLOOP_EXP1,
  FLOOR( SQL_EXP2 ) AS FLOOP_EXP2,
  ROUND( SQL_EXP1, 1 ) AS ROUND_EXP1,
  ROUND( SQL_EXP2, 1 ) AS ROUND_EXP2,
  SQL_EXP3, SQL_EXP4,
  DIV( SQL_EXP3, SQL_EXP4 ) AS DIV,
  MOD( SQL_EXP3, SQL_EXP4 ) AS MOD
FROM @LT_TMP AS A
INTO TABLE @DATA(LT_RESULT).

ZCL_SALV_TEST=>DISPLAY( LT_RESULT ).

 

#2. SQL String Functions

사용예시

TYPES: BEGIN OF T_TMP,
  SQL_EXP1(100) TYPE C,
  SQL_EXP2(100) TYPE C,
  END OF T_TMP.

DATA LT_TMP TYPE STANDARD TABLE OF T_TMP.

LT_TMP = VALUE #( ( SQL_EXP1 = 'aBc dEFG'  SQL_EXP2 = '문자열 2' ) ).

SELECT
  SQL_EXP1, SQL_EXP2,
  CONCAT( SQL_EXP1, SQL_EXP2 ) AS CONCAT,
  CONCAT_WITH_SPACE( SQL_EXP1, SQL_EXP2, 3 ) AS CONCAT_WS,
  LEFT( SQL_EXP1, 2 ) AS LEFT_EXP1,
  LEFT( SQL_EXP2, 2 ) AS LEFT_EXP2,
  RIGHT( SQL_EXP1, 2 ) AS RIGHT_EXP1,
  RIGHT( SQL_EXP2, 2 ) AS RIGHT_EXP2,
  LENGTH( SQL_EXP1 ) AS LENGTH_EXP1,
  LENGTH( SQL_EXP2 ) AS LENGTH_EXP2,
  LOWER( SQL_EXP1 ) AS LOWER_EXP1,
  LOWER( SQL_EXP2 ) AS LOWER_EXP2,
  UPPER( SQL_EXP1 ) AS UPPER_EXP1,
  UPPER( SQL_EXP2 ) AS UPPER_EXP2,
  REPLACE( SQL_EXP1, 'EF', '이에프' )  AS REPLACE_EXP1,
  SUBSTRING( SQL_EXP1, 2, 4 ) AS SUBSTRING
FROM @LT_TMP AS A
INTO TABLE @DATA(LT_RESULT).

ZCL_SALV_TEST=>DISPLAY( LT_RESULT ).

 

#3. SQL Case 구문

쿼리문 내에서 case를 이용하여 조건에 따른 값을 가져올 수 있습니다.

사용 예시

차/대변 지시자(SHKZG)를 CASE를 이용하여 대변(H)일 경우 수량 * -1 처리

TABLES MATDOC.

PARAMETERS: P_WERKS TYPE T001W-WERKS.
SELECT-OPTIONS: S_MATNR FOR MATDOC-MATNR,
                S_BUDAT FOR MATDOC-BUDAT.

SELECT
  A~MATNR,
  T1~MAKTX,
  A~WERKS,
  A~LGORT,
  A~BUDAT,
  SUM( CASE WHEN A~SHKZG EQ 'H' THEN A~MENGE * -1
            ELSE A~MENGE END ) AS MENGE,
  B~PMATN,
  B~VERID
FROM MATDOC AS A
  INNER JOIN CKMLMV013 AS B ON A~AUFNR EQ B~AUFNR
  LEFT OUTER JOIN MAKT AS T1 ON A~MATNR EQ T1~MATNR AND T1~SPRAS EQ @SY-LANGU
WHERE A~MATNR IN @S_MATNR
  AND A~WERKS EQ @P_WERKS
  AND A~BUDAT IN @S_BUDAT
GROUP BY  A~MATNR,
          T1~MAKTX,
          A~WERKS,
          A~LGORT,
          A~BUDAT,
          B~PMATN,
          B~VERID
HAVING SUM( CASE WHEN A~SHKZG EQ 'H' THEN A~MENGE * -1
            ELSE A~MENGE END ) <> 0
INTO TABLE @DATA(LT_TMP).

ZCL_SALV_TEST=>DISPLAY( LT_TMP ).

 

댓글