본문 바로가기

SAP

[SAP] Hana Studio 쿼리 분기 처리 방법

728x90
반응형

쿼리 분기 처리

 

1. CASE 문을 활용한 조건 분기 (쿼리 내에서 IF 대체)

 
HANA SQL에서는 IF 문 자체는 쿼리에서 직접 쓸 수 없다. 대신 CASE WHEN ... THEN 문을 사용해 IF처럼 조건 분기 처리를 할 수 있다.
 
▶ 예시: 조건에 따라 WHERE 절 필터 다르게 적용

SELECT *
FROM MY_TABLE
WHERE
  CASE
    WHEN :condition = 'A' THEN COLUMN1
    WHEN :condition = 'B' THEN COLUMN2
    ELSE COLUMN3
  END = 'SomeValue';
  • :condition은 입력 파라미터 (변수처럼 사용 가능)
  • 조건값에 따라 필터링 컬럼을 다르게 적용 


2. SQLScript 내에서 IF 사용 (Procedure/Function 내부)

 
 만약 쿼리가 아닌 Stored Procedure나 Calculation View (Scripted) 내에서는 IF 문 사용이 가능하다.
 
▶ 예: SQLScript 내 조건 분기

IF input_param = 'A' THEN
  SELECT * FROM MY_TABLE WHERE COLUMN1 = 'X';
ELSE
  SELECT * FROM MY_TABLE WHERE COLUMN2 = 'Y';
END IF;

 

  • 단, 이건 SQLScript (BEGIN … END) 블록 내부에서만 가능
  • 일반 쿼리 콘솔에서는 불가능

 
3. Dynamic SQL 방식 (고급)
 
SQL을 동적으로 구성해서 실행하는 방식도 있다. (Stored Procedure 내에서 주로 사용)

DECLARE lv_sql NVARCHAR(1000);
 
IF :param = 'A' THEN
  lv_sql := 'SELECT * FROM MY_TABLE WHERE COLUMN1 = 'X';
ELSE
  lv_sql := 'SELECT * FROM MY_TABLE WHERE COLUMN2 = 'Y';
END IF;
 
EXECUTE IMMEDIATE :lv_sql;

 

구분 분기 처리 가능 여부 사용 방법
일반 SELECT 쿼리 직접 IF 사용 불가 CASE WHEN 사용
SQLScript IF 가능 IF ... THEN 문법
동적 쿼리 구성 가능 EXECUTE IMMEDIATE

 
 

특정 조건일 때만 WHERE절을 적용하고, 조건에 맞지 않으면 WHERE절 자체를 무시하고 전체 데이터 가져오는 패턴 

 
 1. 조건을 WHERE절 내부에서 컨트롤 

SELECT *
FROM MY_TABLE
WHERE 
  (:use_filter = 'Y' AND STATUS = 'ACTIVE') 
  OR 
  (:use_filter <> 'Y');

 

  • :use_filter 는 외부에서 넘기는 파라미터 (예: ‘Y’ or ‘N’)
  • use_filter = 'Y' → STATUS = 'ACTIVE' 필터가 적용됨
  • use_filter ≠ 'Y' → WHERE절 전체가 TRUE가 되어 모든 행이 조회됨

실제 업무 예제

SELECT *
FROM EMPLOYEES
WHERE 
  (:filter_dept = 'Y' AND DEPT_ID = 'D100')
  OR
  (:filter_dept = 'N');

 

  • filter_dept = 'Y' → 부서 필터링
  • filter_dept = 'N' → 전체 부서 조회

 


특정 조건에 맞을 때만 AND 조건을 추가하고, 아니면 무시하는 패턴
  
1. AND 조건을 특정 상황일 때만 적용

SELECT *
FROM MY_TABLE
WHERE 1=1
  AND (:use_filter = 'N' OR STATUS = 'ACTIVE')
  AND (:use_date_filter = 'N' OR CREATED_AT >= '2024-01-01')

 
▶ 동작 설명:

조건 파라미터 효과
:use_filter = 'Y' STATUS = 'ACTIVE' 적용됨 AND 조건 포함됨
:use_filter = 'N' 무조건 TRUE → 필터 미적용 조건 생략된 것과 같음

즉, AND (:param = 'N' OR 조건) 형태로 쓰면

  • 파라미터가 Y일 때 → 조건 적용
  • 파라미터가 N일 때 → OR TRUE가 되어 전체 허용

실제 업무 예제

SELECT *
FROM SALES_ORDERS
WHERE 1=1
  AND (:filter_customer = 'N' OR CUSTOMER_ID = 'C123')
  AND (:filter_date = 'N' OR ORDER_DATE >= '2024-01-01')
  AND (:filter_status = 'N' OR STATUS = 'OPEN');

 

 
→ 파라미터 세팅 예시: 

필드 적용되는 조건
filter_customer 'Y' CUSTOMER_ID = ‘C123’
filter_date 'N' 전체 날짜 허용 (필터 미적용)
filter_status 'Y' STATUS = ‘OPEN’

 

728x90
반응형