[Oracle] WHERE 조건절에 CASE(IF) 를 통해 조건을 설정해 보기 , 한방쿼리?

WHERE 조건절에 CASE 로 IF 와 같은 효과를 내봅시다. 목적은 한 방 쿼리를 만들어 보는 것입니다~! 프로그래밍 방법으로 조건 분기를 하지 못하는 상황에서 유용하게 사용할 수 있을 것입니다.

예를 들면, 사용자에게 하나의 쿼리를 제공하여 조건에 맞추어 조회를 할 수 있도록 지원할 때 사용할 수 있습니다. 한방쿼리가 안 된다면 조건에 따라 조회문장이 계속 나누어지겠죠? 이를 보완하기 위한 방법이랍니다. 지금 당장 적용하기 어렵더라도 이러한 기능도 있구나, 하고 알아두면 나중에 쓸 데가 있을 거예요.

한방쿼리

이번 예제에서 사용할 자료입니다.

private void Run()
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine(" SELECT * ");
    sb.AppendLine("   FROM EMP ");
    sb.AppendLine("  WHERE 0 = 0 ");
    if (txtVar.Text == "ALL")
    {
        //Select All Data
    }
    else
    {
        sb.AppendLine("    AND JOB = :VJOB ");//Select Data by Job
    }
}

예제 소스는 txtVar.Text 가 "ALL" 일 때는 조건을 생략하고 모든 데이터를 조회합니다. 그리고 txtVar.Text가 그외의 값이면 [JOB] 이 일치하는 데이터를 찾아갑니다. 텍스트박스의 값에 따라 쿼리가 달라질 것입니다.

txtVar.Text 가 "ALL" 인 경우

SELECT *
  FROM EMP
 WHERE 0 = 0 

txtVar.Text 가 그외의 값인 경우("ALL" 이 아닌 경우)

SELECT *
  FROM EMP
 WHERE 0 = 0 
     AND JOB = :VJOB

이때 비정형데이터를 조회하는 목적으로 사용자에게 쿼리를 제공한다면 아래와 같을 것입니다.

SELECT *
  FROM EMP
 WHERE 0 = 0 
     AND JOB = :VJOB --모든 JOB을 조회하시려면 이 줄을 지우고 조회하세요.

한방쿼리는 이럴 때에 도움이 될 것입니다. WHERE 절에 CASE 를 이용하여 한방쿼리를 만들 수 있습니다.

--VJOB 에 ALL 을 입력하시면 모든 JOB을 조회합니다.
SELECT *
  FROM EMP
 WHERE 0 = 0
       AND 1 =
              CASE
                 WHEN 'ALL' = :VJOB THEN 1
                 WHEN JOB = :VJOB THEN 1
                 ELSE 0
              END
ALL

한방쿼리에 ALL 을 입력한 경우입니다. 모든 데이터를 조회합니다.

some

한방쿼리에 SALESMAN을 입력한 결과입니다.

댓글