From Zero to SAP
07. ABAP Open SQL 기초 - SELECT 문법 완전 정리 본문
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)를 정리할 예정이다.
'ABAP > 이론' 카테고리의 다른 글
| 09. ABAP Open SQL 심화 - JOIN, GROUP BY, 서브쿼리, WITH (0) | 2026.04.07 |
|---|---|
| 08. ABAP Open SQL WHERE 조건 완전 정리 - BETWEEN, IN, RANGE, FOR ALL ENTRIES (0) | 2026.04.07 |
| 06. ABAP Open SQL 완전 정리 (SAP Architecture, New Open SQL, Code Push Down, 데이터 모델링) (0) | 2026.04.03 |
| 05. ABAP 기본 문법 정리(2) – 구조체, Dictionary, VALUE, LET (0) | 2026.04.02 |
| 04. 기본 문법 정리(1) – 데이터 타입, 변수, 조건문, 반복문 (0) | 2026.04.02 |