From Zero to SAP

07. ABAP Open SQL 기초 - SELECT 문법 완전 정리 본문

ABAP/이론

07. ABAP Open SQL 기초 - SELECT 문법 완전 정리

권쌥 2026. 4. 7. 19:07

SAP ABAP을 공부하면서 가장 먼저 마주치는 것이 Open SQL이다.
Open SQL은 ABAP에서 데이터베이스를 조회하기 위한 SQL 문법으로, 일반 SQL과 유사하지만 ABAP 환경에 맞게 최적화된 문법을 사용한다. 이번 포스팅에서는 SELECT 문법의 기초부터 자주 사용하는 함수들까지 정리해본다.

 

SELECT DISTINCT

중복된 결과를 제거하고 싶을 때 사용한다.

SELECT DISTINCT empcd
  FROM zemplist
  INTO TABLE @DATA(gt_empcd).

같은 부서 코드가 여러 번 나와도 한 번만 출력된다.


인라인 변수 선언 — @DATA

변수를 미리 선언하지 않고 SELECT 안에서 바로 선언할 수 있다.

" 단건 조회
SELECT SINGLE empcd, ename
  FROM zemplist
  WHERE empcd = '1001'
  INTO @DATA(gs_emp).

" 여러 건 조회
SELECT empcd, ename
  FROM zemplist
  INTO TABLE @DATA(gt_emp).

@DATA를 사용하면 타입을 따로 선언하지 않아도 컴파일러가 자동으로 타입을 추론한다. 코드가 훨씬 간결해진다.


날짜 함수 (DATS)

ABAP에서 날짜 타입은 DATS이고, 현재 날짜는 시스템 변수 sy-datum으로 가져온다. datum은 독일어로 날짜라는 뜻이다.

" 현재 날짜
DATA(gv_today) = sy-datum.

" 두 날짜 사이의 일수
DATA(gv_days) = DATS_DAYS_BETWEEN( '20240101', sy-datum ).

" n개월 더하기
DATA(gv_date) = DATS_ADD_MONTHS( sy-datum, 3 ).

" 유효한 날짜인지 확인
IF DATS_IS_VALID( '20240132' ) = ''.  " 1월 32일 → 유효하지 않음
  " 처리
ENDIF.

문자열 함수

문자열 연결 — &&

SELECT emp_id && '-' && emp_name AS idname
  FROM ztemp
  INTO TABLE @DATA(gt_result).
" 결과: '1001-김철수'

 

SUBSTRING — 문자열 자르기

" 3번째 자리부터 4글자 추출
DATA(gv_sub) = SUBSTRING( '20240101', 3, 4 ).
" 결과: '2401'

" 왼쪽에서 4글자
DATA(gv_left) = LEFT( '20240101', 4 ).
" 결과: '2024'

" 오른쪽에서 2글자
DATA(gv_right) = RIGHT( '20240101', 2 ).
" 결과: '01'

 

자주 쓰는 문자열 함수 모음

CONCAT 문자열 연결 CONCAT( 'A', 'B' ) → 'AB'
UPPER 대문자 변환 UPPER( 'abap' ) → 'ABAP'
LOWER 소문자 변환 LOWER( 'ABAP' ) → 'abap'
LPAD 왼쪽 채우기 LPAD( '1', 4, '0' ) → '0001'
LTRIM 왼쪽 공백 제거 LTRIM( ' abc' ) → 'abc'
REPLACE 문자열 치환 REPLACE( 'abc', 'b', 'x' ) → 'axc'

SELECT 안에서 CASE 분기

SQL 안에서 조건에 따라 다른 값을 출력할 수 있다.

SELECT empcd, ename,
       CASE pstion
         WHEN '과장' THEN '중간관리자'
         WHEN '부장' THEN '고위관리자'
         ELSE '일반직원'
       END AS grade
  FROM zemplist
  INTO TABLE @DATA(gt_result).

AND, OR 조건도 사용할 수 있다.

SELECT empcd, ename,
       CASE
         WHEN pstion = '과장' AND depcd = 'D001' THEN 'D001 과장'
         WHEN pstion = '부장' OR depcd = 'D002'  THEN '해당자'
         ELSE '기타'
       END AS label
  FROM zemplist
  INTO TABLE @DATA(gt_result).

COALESCE — NULL 대체

JOIN 결과에서 NULL이 나올 때 다른 값으로 대체한다.

SELECT a~empcd, a~ename,
       COALESCE( b~certname, '자격증 없음' ) AS certname
  FROM zemplist AS a
  LEFT OUTER JOIN zcert AS b
    ON a~empcd = b~empcd
  INTO TABLE @DATA(gt_result).

자격증이 없는 직원의 certname이 NULL 대신 '자격증 없음'으로 출력된다.


INTO TABLE vs APPENDING TABLE

" INTO TABLE → 기존 데이터 비우고 새로 채움
SELECT empcd, ename
  FROM zemplist
  INTO TABLE @DATA(gt_itab).

" APPENDING TABLE → 기존 데이터 유지하고 추가
SELECT empcd, ename
  FROM zemplist WHERE depcd = 'D002'
  APPENDING TABLE @gt_itab.

INTO TABLE은 그릇을 비우고 새로 담는 것이고, APPENDING TABLE은 기존 그릇에 추가로 쌓는 것이다.


SELECT * 를 쓰면 안 되는 이유

" 이렇게 쓰지 말 것
SELECT * FROM zemplist INTO TABLE @DATA(gt_itab).

" 이렇게 필요한 컬럼만
SELECT empcd, ename FROM zemplist INTO TABLE @DATA(gt_itab).

ABAP 프로그램이 실행되는 애플리케이션 서버와 데이터가 저장된 데이터베이스 서버는 네트워크로 연결되어 있다.

SELECT *를 사용하면 불필요한 컬럼까지 네트워크를 통해 전송되기 때문에 데이터가 많을수록 성능이 크게 저하된다.

항상 필요한 컬럼만 명시하는 습관을 들이는 것이 중요하다.


다음 포스팅에서는 WHERE 조건 심화 (BETWEEN, IN, RANGE, FOR ALL ENTRIES)를 정리할 예정이다.