ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SAP HANA SQL - 4.5 Operators / 4.6 Expressions
    SAP 2026. 5. 29. 19:06

    sap_hana_sql_45_46.html
    0.02MB

     

     

    SAP HANA SQL - 4.5 Operators / 4.6 Expressions 정리

    SAP HANA SQL Reference — Operators & Expressions

    📖 SAP HANA SQL Reference Guide for SAP HANA Platform  |  4.5 Operators (p.51~55) / 4.6 Expressions (p.56~61)

    4.5 Operators

    Operator는 산술 계산, 값 비교, 값 할당 등을 수행하는 연산 기호입니다.

    1. Unary & Binary Operators

    구분설명형식종류
    Unary 단항 피연산자 1개에 적용 operator operand + (양수), - (부호 반전), NOT (논리 부정)
    Binary 이항 피연산자 2개에 적용 operand1 operator operand2 * / + -  |  = != < > <= >=  |  AND OR

    2. Operator Precedence (연산자 우선순위)

    괄호 ()를 사용하면 우선순위를 변경할 수 있으며, 같은 우선순위의 연산자는 좌 → 우 순서로 평가됩니다.

    우선순위연산자설명
    ① 최고()괄호
    +, -단항 양수 / 음수
    *, /곱셈, 나눗셈
    +, -덧셈, 뺄셈
    ||문자열 연결
    = != < > <= >= IS NULL LIKE BETWEEN비교
    NOT논리 부정
    AND논리 AND
    ⑨ 최저OR논리 OR

    3. Arithmetic Operators (산술 연산자)

    연산자설명NULL 처리
    -<expr>부호 반전 (Negation)결과 NULL
    expr + expr덧셈결과 NULL
    expr - expr뺄셈결과 NULL
    expr * expr곱셈결과 NULL
    expr / expr나눗셈NULL이거나 제수 = 0 → 에러

    DECIMAL(p, s) 결과 정밀도 규칙

    e1 = DECIMAL(p1, s1), e2 = DECIMAL(p2, s2) 일 때:

    연산Result PrecisionResult Scale
    e1 + e2max(s1,s2) + max(p1-s1, p2-s2) + 1max(s1, s2)
    e1 - e2max(s1,s2) + max(p1-s1, p2-s2) + 1max(s1, s2)
    e1 * e2p1 + p2s1 + s2
    e1 / e2p1 - s1 + s2 + max(6, s1+p2+1)max(6, s1+p2+1)
    ⚠️ 결과 precision이 38을 초과하면 자동으로 DECIMAL(부동소수점) 타입으로 변환됩니다.

    4. String Operators (문자열 연산자)

    연산자설명
    expr || expr문자열 연결 (두 개의 수직바). 어느 한쪽이 NULL이면 결과도 NULL
    💡 길이 제한
    · NVARCHAR 포함 시 결과 타입 = NVARCHAR, 최대 64MB
    · VARCHAR 연결은 최대 5,000자
    · 앞뒤 공백(leading / trailing spaces)은 유지됨

    5. Comparison Operators (비교 연산자)

    문법: <expression1> <comparison_operator> <expression2>

    연산자설명예시
    =같음WHERE id = 25
    >초과WHERE id > 25
    <미만WHERE id < 25
    >=이상WHERE id >= 25
    <=이하WHERE id <= 25
    != 또는 <>같지 않음WHERE id != 25

    6. Logical Operators (논리 연산자)

    연산자문법설명
    AND WHERE cond1 AND cond2 모두 TRUE → TRUE  /  하나라도 FALSE → FALSE  /  나머지 → UNKNOWN
    OR WHERE cond1 OR cond2 하나라도 TRUE → TRUE  /  모두 FALSE → FALSE  /  나머지 → UNKNOWN
    NOT WHERE NOT condition TRUE ↔ FALSE 반전. UNKNOWN은 그대로 UNKNOWN

    7. Set Operators (집합 연산자)

    여러 쿼리 결과를 하나의 결과 집합으로 합칠 때 사용합니다.

    연산자설명
    UNION두 쿼리 결과 합산 (중복 제거)
    UNION ALL두 쿼리 결과 합산 (중복 포함)
    INTERSECT두 쿼리의 공통 행만 반환
    EXCEPT / MINUS첫 번째 쿼리에서 두 번째 쿼리 결과를 제거 (MINUSEXCEPT의 동의어)
    💡 AMDP SQLScript에서도 동일하게 적용됩니다. 중복 제거가 필요 없다면 UNION 대신 UNION ALL을 사용하는 것이 성능상 유리합니다.

    4.6 Expressions

    Expression이란 값을 반환하도록 평가될 수 있는 절(clause)입니다.

    1. Expression 기본 문법

    <expression> ::=
        <case_expression>
      | <function_expression>
      | <aggregate_expression>
      | ( <expression> )
      | ( <subquery> )
      | - <expression>
      | <expression> <operator> <expression>
      | <variable_name>
      | <constant>
      | [<correlation_name>.]<column_name>

    2. Case Expressions

    SQL 문 안에서 IF-THEN-ELSE 로직을 SQLScript 없이 구현합니다.

    ① Simple CASE — 동등 비교

    CASE <expression>
      WHEN <expression> THEN <expression>
      [WHEN <expression> THEN <expression>] ...
      [ELSE <expression>]
    END

    ② Searched CASE — 조건식 비교

    CASE
      WHEN <condition> THEN <expression>
      [WHEN <condition> THEN <expression>] ...
      [ELSE <expression>]
    END
    ⚠️ 평가 순서 비결정성 (중요!)

    HANA Optimizer는 WHEN/THEN 절의 평가 순서를 보장하지 않습니다.
    · 모든 expression이 에러 없이 실행 → 결과는 결정적(deterministic)
    · 어떤 expression이 에러를 throw → 결과는 비결정적 (에러 발생 or 값 반환 모두 가능)

    Simple CASE / Searched CASE 모두 동일하게 적용됩니다.

    예시 — 평가 순서에 따른 결과 차이

    -- p1은 항상 TRUE, e2는 항상 예외 발생하는 상황
    CASE WHEN p1 THEN e1 WHEN p2 THEN e2 ELSE e3 END
    
    -- 순서 ① p1→e1→p2→e2→e3
    --   p1=TRUE → e1 반환, p2/e2/e3 평가 안 함 → 정상 반환
    -- 순서 ② e1→e2→e3→p1→p2
    --   e2 예외 발생 → 전체 예외 throw
    -- SAP HANA에서 두 경우 모두 가능!

    3. Function Expressions

    SQL 내장 함수를 Expression으로 사용합니다.

    <function_name> ( <expression> [, <expression>] ... )

    4. Aggregate Expressions

    여러 행의 값을 집계하여 단일 값을 반환합니다.

    문법

    COUNT(*)
    | COUNT( DISTINCT <expression_list> )
    | <agg_name> ( [ALL | DISTINCT] <expression> )
    | STRING_AGG( <expression> [, <delimiter>]
                  [ORDER BY <expression> [ASC|DESC] [NULLS FIRST|NULLS LAST]] )
    
    -- agg_name 목록:
    -- CORR | CORR_SPEARMAN | COUNT | MIN | MEDIAN | MAX | SUM | AVG
    -- STDDEV | VAR | STDDEV_POP | VAR_POP | STDDEV_SAMP | VAR_SAMP

    집계 함수 목록

    함수명설명
    COUNT(*)전체 행 수 (NULL · 중복 포함)
    COUNT(expr)Non-NULL 값의 행 수
    COUNT(DISTINCT ...)고유값 조합 수 (all-NULL 튜플 제외)
    MIN최솟값
    MAX최댓값
    SUM합계
    AVG산술 평균
    MEDIAN중앙값 (숫자 타입 컬럼)
    STDDEV표준편차 (VAR의 제곱근)
    STDDEV_POP모집단 표준편차
    STDDEV_SAMP표본 표준편차
    VAR분산
    VAR_POP모집단 분산
    VAR_SAMP표본 분산 (행 수 = 1이면 NULL 반환)
    CORRPearson 상관계수
    CORR_SPEARMANSpearman 순위 상관계수
    STRING_AGG문자열 연결 집계
    ⚠️ DISTINCT와 함께 사용 불가: STDDEV_POP, STDDEV_SAMP, VAR_POP, VAR_SAMP

    숫자 타입별 결과 타입

    함수TINYINTSMALLINTINTEGERBIGINTDECIMAL(p,s)REALDOUBLE
    COUNTBIGINTBIGINT
    MIN / MAXTINYINTSMALLINTINTEGERBIGINTDECIMAL(p,s)REALDOUBLE
    SUMINTEGERINTEGERINTEGERBIGINTDECIMAL(p',s)*REALDOUBLE
    AVG / STDDEV / VARDECIMAL(9,6)DECIMAL(11,6)DECIMAL(16,6)DECIMAL(25,6)DECIMAL(p,s)REALDOUBLE
    💡 SUM의 p' 결정 규칙: p ≤ 18 → p'=18  /  p ≤ 28 → p'=28  /  p ≤ 38 → p'=38

    COUNT(DISTINCT) 예시 — all-NULL 튜플 제외

    CREATE ROW TABLE T (A INT, B INT);
    INSERT INTO T VALUES (NULL, NULL);  -- all-NULL → 제외
    INSERT INTO T VALUES (1, NULL);
    INSERT INTO T VALUES (1, NULL);     -- 중복 → 1개 처리
    INSERT INTO T VALUES (NULL, 1);
    INSERT INTO T VALUES (1, 1);
    INSERT INTO T VALUES (1, 1);        -- 중복 → 1개 처리
    
    SELECT COUNT(DISTINCT A, B) AS DISTINCT_A_B FROM T;
    -- 결과: 3
    --  (A=1, B=NULL) / (A=NULL, B=1) / (A=1, B=1)

    5. JSON Object Expressions

    JSON 컬렉션 테이블과 함께 사용하며, JSON 객체를 직접 생성합니다.

    문법

    -- 기본 JSON 오브젝트
    {"<key>": <json_value_expression>}
    
    -- value 타입: string / numeric / boolean / NULL / path / 중첩 object / array
    -- array: [ value1, value2, ... ]
    구분설명
    key문자열 리터럴과 유사, 반드시 이중 따옴표로 감쌈
    value문자열, 숫자, 불린, NULL, 중첩 JSON 객체, 배열 모두 가능
    사용 가능 구문SELECT, UPDATE, INSERT INTO + 산술 연산자(+ - * /)

    예시

    -- 단순 JSON 객체
    { "firstname":'John', "lastname":'Smith', "age":45 }
    
    -- 중첩 JSON 객체
    { "firstname":'John', "lastname":'Smith', "age":45,
      "address": { 'street':'Dietmar-Hopp-Allee', 'city':'Heidelberg' } }

    6. Subqueries in Expressions

    괄호로 감싼 SELECT 문을 Expression으로 사용합니다.

    <scalar_subquery_expression> ::= ( <subquery> )
    규칙내용
    SELECT 항목 수1개만 허용
    반환값0개 또는 1개(스칼라)
    사용 가능 위치SELECT 리스트, UPDATESET
    사용 불가 위치GROUP BY 절 내부 ⚠️

    예시 — 부서별 직원 수 + 전체 직원 수 함께 조회

    SELECT DepartmentName,
           COUNT(*),
           'out of',
           (SELECT COUNT(*) FROM Employees)   -- 스칼라 서브쿼리
    FROM Departments AS D
       , Employees   AS E
    WHERE D.DepartmentID = E.DepartmentID
    GROUP BY DepartmentName;
    #SAP_HANA #SQLScript #AMDP #Operators #Expressions #CASE #AggregateFunction #UNION #DECIMAL_precision #JSON #Subquery
Designed by Tistory.