목차
1. 주요특징
- 향상된 선택문(Select Statements): 조인, 서브쿼리, 복잡한 조건, 집계 함수 등 SQL의 고급 기능을 ABAP에서 직접 사용할 수 있습니다.
- 표현식과 함수의 지원: 문자열 함수, 수학 함수, 날짜 및 시간 함수 등 다양한 내장 함수를 쿼리 내에서 사용할 수 있으며, 이를 통해 데이터 처리가 더 유연해집니다.
- 개선된 조인 기능: 내부 조인(Inner Join), 외부 조인(Left Outer Join) 등을 포함하여 다양한 종류의 SQL 조인을 지원합니다. 이를 통해 복잡한 데이터 관계를 쉽게 쿼리할 수 있습니다.
- 인라인 선언을 통한 효율적인 데이터 처리: New Open SQL 결과를 처리하기 위해 인라인으로 데이터 정의를 선언할 수 있으며, 이는 코드를 더 간결하고 읽기 쉽게 만듭니다.
- 향상된 통합: CDS(Views)와 같은 SAP HANA 최적화 기능과의 향상된 통합을 제공합니다. New Open SQL은 SAP HANA의 기능을 최대한 활용하여 성능을 개선할 수 있도록 설계되었습니다.
2. 사용예제
예제1) Inline Declaration
DATA : LV_CARRID LIKE SFLIGHT-CARRID,
LV_CONNID LIKE SFLIGHT-CONNID.
SELECT CARRID,
CONNID,
FLDATE,
@SY-DATUM AS DATUM,
'X' AS VALUE
INTO TABLE @DATA(LT_SFLIGHT)
FROM SFLIGHT
WHERE CARRID = @LV_CARRID
AND CONNID = @LV_CONNID
ORDER BY CARRID, CONNID.
New Open SQL은 Inline 선언 @DATA(LT_SFLIGHT)를 통해 결과값을 받는 변수를 간결하게 선언할 수 있습니다.
@ 기호는 호스트 변수(host variable) 또는 ABAP 변수를 SQL 문 내에서 참조할 때 사용됩니다.
이는 SQL 문이 ABAP 변수의 값을 안전하게 사용할 수 있도록 하며, 보안 취약점을 방지하는 데 도움을 줍니다.
New Open SQL의 이 기능은 특히 변수 바인딩(variable binding)에 사용되며, SQL 문 내에서 ABAP 데이터를 직접 참조하고 조작할 수 있게 해줍니다.
예제2) FIELDS
DATA : LV_CARRID LIKE SFLIGHT-CARRID,
LV_CONNID LIKE SFLIGHT-CONNID.
SELECT
FROM SFLIGHT AS A INNER JOIN SPFLI AS B
ON A~CARRID = B~CARRID
AND A~CONNID = B~CONNID
FIELDS A~CARRID,
A~CONNID,
A~FLDATE
WHERE A~CARRID = @LV_CARRID
AND A~CONNID = @LV_CONNID
ORDER BY A~CARRID, A~CONNID
INTO TABLE @DATA(LT_SFLIGHT).
FIELDS 절을 사용하여 더 표현력 있고 간결한 쿼리 작성이 가능하며, 이를 통해 컬럼 목록을 더 명확하게 정의할 수 있습니다.
JOIN조건이 복잡한 쿼리에서 필드를 확인하면서 WHERE조건을 코딩할때 유리합니다.
예제3) DIV/ DIVISION/ MOD
DATA : LV_CARRID LIKE SFLIGHT-CARRID,
LV_CONNID LIKE SFLIGHT-CONNID.
SELECT CARRID,
CONNID,
FLDATE,
SEATSMAX,
DIV( SEATSMAX, 10 ) AS DIV,
DIVISION( SEATSMAX, 10, 1 ) AS DIVISION,
MOD( SEATSMAX, 10 ) AS MOD
FROM SFLIGHT
WHERE CARRID = @LV_CARRID
AND CONNID = @LV_CONNID
ORDER BY CARRID, CONNID
INTO TABLE @DATA(LT_SFLIGHT).
DIV: 두 피연산자 간의 나눗셈을 수행하고, 나눗셈의 결과로 나온 몫을 반환합니다.
DIVISION: 두 피연산자 간의 나눗셈을 수행하고, 나눗셈의 결과를 반환합니다.(결과값의 소숫점을 지정)
MOD: 두 피연산자 간의 나눗셈을 수행하고, 그 결과로 나오는 나머지를 반환합니다.
예제4) CEIL/ FLOOR/ ROUND
DATA : LV_CARRID LIKE SFLIGHT-CARRID,
LV_CONNID LIKE SFLIGHT-CONNID.
SELECT CARRID,
CONNID,
FLDATE,
PRICE,
CEIL( PRICE ) AS CEIL,
FLOOR( PRICE ) AS FLOOR,
ROUND( PRICE, 0 ) AS ROUND
FROM SFLIGHT
WHERE CARRID = @LV_CARRID
AND CONNID = @LV_CONNID
ORDER BY CARRID, CONNID
INTO TABLE @DATA(LT_SFLIGHT).
CEIL: 실수 값을 받아 그보다 크거나 같은 최소의 정수로 올림하여 반환하는 함수입니다.(올림함수)
FLOOR: 실수 값을 받아 그보다 작거나 같은 최대의 정수로 내림하여 반환하는 함수입니다.(내림함수)
ROUND: 실수 값을 받아 그보다 가장 가까운 정수로 반올림하는 수학 함수입니다.(반올림함수)
예제5) COALESCE/ ABS
DATA : LV_CARRID LIKE SFLIGHT-CARRID.
SELECT A~CARRID,
B~CONNID,
B~FLDATE,
B~SEATSOCC,
COALESCE( B~SEATSOCC_B, B~SEATSOCC_F, 10000000 ) AS COALESCE,
B~PAYMENTSUM,
ABS( B~PAYMENTSUM ) AS ABS
FROM SCARR AS A LEFT OUTER JOIN SFLIGHT AS B
ON A~CARRID = B~CARRID
WHERE A~CARRID = @LV_CARRID
ORDER BY A~CARRID, B~CONNID
INTO TABLE @DATA(LT_SFLIGHT).
COALESCE: 주어진 인자 목록 중에서 NULL이 아닌 최초의 값을 반환합니다. 이 함수는 여러 개의 인자를 받을 수 있으며, 인자 목록에서 처음으로 나타나는 NULL이 아닌 값을 찾아 반환합니다.
위 예제에서는 먼저 B~SEATSOCC_B 필드가 NULL인제 체크하고 NULL이면 B~SEATSOCC_F필드가 NULL인치 체크합니다. 둘다 NULL인경우 10000000값을 반환합니다.
ABS: 절대값(Absolute Value)을 계산하는 수학 함수로, 어떤 숫자의 양수 형태를 반환합니다.
이 함수는 음수를 입력으로 받으면 그 수의 양의 값으로, 양수를 입력으로 받으면 그대로 양수를 반환합니다.
예제6) CASE/ CAST
DATA : LV_CARRID LIKE SFLIGHT-CARRID,
LV_CONNID LIKE SFLIGHT-CONNID.
SELECT CARRID,
CASE CARRID WHEN 'AA' THEN 'American air'
WHEN 'AF' THEN 'Air France'
ELSE 'Etc'
END AS CARRID_DESC,
CAST( PRICE AS CHAR ) AS PRICE_CHAR,
CAST( PRICE AS DEC( 10,1 ) ) AS PRICE_DEC
FROM SFLIGHT
WHERE CARRID = @LV_CARRID
AND CONNID = @LV_CONNID
ORDER BY CARRID, CONNID
INTO TABLE @DATA(LT_SFLIGHT).
CASE: 특정 조건에 따라 다른 값을 반환하는 조건부 로직을 구현하는 데 사용되는 SQL 구문입니다.
위 에제는 CARRIDI값이 'AA'이면 'American air'를 반환하고 'AF'이면 'Air France'를 반환하고 둘다 아니면 'Etc'를 반환 합니다.
CAST: 한 데이터 타입을 다른 데이터 타입으로 변환하는 데 사용됩니다.
이 함수는 데이터베이스 쿼리 내에서 데이터의 형식을 명시적으로 변환할 필요가 있을 때 유용하게 사용됩니다.
예를 들어, 문자열 형식의 데이터를 날짜 형식으로 변환하거나, 정수를 실수로 변환하는 경우 등에 CAST를 사용할 수 있습니다.
예제7) CONCATENATE
DATA : LV_CARRID LIKE SFLIGHT-CARRID.
SELECT CONCAT( CARRID, PLANETYPE ) AS STR1,
CONCAT_WITH_SPACE( CARRID, PLANETYPE, 5 ) AS STR2,
CARRID && PLANETYPE && 'TEST' AS STR3,
'CHAR1' && 'CHAR2' AS STR4
FROM SFLIGHT
WHERE CARRID = @LV_CARRID
INTO TABLE @DATA(LT_SFLIGHT).
CONCAT: 이 함수는 두 개의 문자열을 입력으로 받아 순서대로 이어붙여 새로운 단일 문자열을 생성합니다.
CONCAT_WITH_SPACE: 이 함수는 두 개의 문자열을 결합할 때 사이에 공백을 추가하는 특화된 함수입니다. 이 함수는 여러 문자열을 하나로 결합하면서, 지정된 수의 공백을 각 문자열 사이에 삽입합니다.
&&: 이 연산자는 두 개 이상의 문자열을 서로 붙여 하나의 문자열로 만들때 간단하게 사용할 수 있습니다.
예제8) UNION/ UNION ALL
SELECT CARRID, CONNID, FLDATE
FROM SFLIGHT
WHERE CARRID = 'AA'
UNION
SELECT CARRID, CONNID, FLDATE
FROM SFLIGHT
WHERE CARRID = 'AA'
UNION
SELECT CARRID, CONNID, FLDATE
FROM SFLIGHT
WHERE CARRID = 'LH'
INTO TABLE @DATA(LT_SFLIGHT).
UNION 연산자는 두 개 이상의 SELECT 쿼리의 결과를 하나의 결과 집합으로 결합하는 데 사용됩니다.
이 연산자는 여러 개의 독립된 쿼리 결과를 단일 결과로 통합할 때 유용하며, 각 쿼리의 결과에서 중복된 행을 제거합니다.
위 예제에서 UNION ALL 연산자를 사용하면 중복 제거를 하지 않고 모든 결과 행을 포함시킬 수 있습니다.
예제9) JOIN OFFSET
DATA : LV_MBLNR LIKE MKPF-MBLNR.
SELECT A~MBLNR,
A~MJAHR
FROM MKPF AS A INNER JOIN MSEG AS B
ON B~MJAHR = LEFT( A~BUDAT, 4 )
WHERE A~MBLNR = @LV_MBLNR
AND A~MJAHR = @SY-DATUM+0(4)
AND A~MJAHR = LEFT( @SY-DATUM, 4 )
INTO TABLE @DATA(LT_MBLNR).
LEFT함수는 JOIN구문 사용시 조인조건의 필드길이가 서로 다를때 사용하면 편리합니다.
JOIN조건 뿐만 아니라 WHERE조건에서도 사용 가능합니다.
예제10) WITH
WITH
+CONNS AS (
SELECT B~CARRNAME, A~CONNID, A~CITYFROM, A~CITYTO
FROM SPFLI AS A INNER JOIN SCARR AS B
ON A~CARRID = B~CARRID
WHERE A~CARRID = 'LH' ),
+CNTS AS (
SELECT COUNT(*) AS CNT
FROM +CONNS )
SELECT *
FROM +CNTS CROSS JOIN +CONNS
ORDER BY CARRNAME, CONNID
INTO TABLE @DATA(LT_SPFLI).
WITH 절을 사용하면, 하나의 SQL 문 내에서 임시 결과 집합을 생성하고, 이를 쿼리의 다른 부분에서 재사용할 수 있습니다. 이 기능은 복잡한 데이터 처리 로직을 구현할 때 특히 유용합니다.
3. 장점
NEW OPEN SQL의 함수 및 구문들은 복잡한 쿼리를 더 간결하고 읽기 쉬운 형태로 작성할 수 있게 해주어, 코드의 가독성을 크게 향상시킵니다.
이를 통해, 코드의 오류 가능성을 줄이고 팀 내에서의 협업과 코드 공유가 용이해집니다.
또한, 고급 함수와 표현식을 포함한 향상된 기능을 제공함으로써, 조건부 로직, 문자열 및 날짜 처리와 같은 복잡한 데이터 처리 요구사항을 쉽게 구현할 수 있습니다.