스프링데이터 + JPA/QueryDSL

18. CASE 문

sdafdq 2023. 11. 30. 11:58

SQL문에서 CASE문을 쓰는 건 처음봤다.

 

프로시저에서는 몰라도, SQL 쿼리에 직접 쓰는 건 처음봤다.

 

@Test
public void basicCase(){
    List<String> result = query.select(m.age
                    .when(10).then("열살")
                    .when(20).then("스무살")
                    .otherwise("기타"))
            .from(m).fetch();

    for (String s : result) {
        System.out.println("s = " + s);
    }
}

뭐 보면,

select 절 위주로 보면,

m.age가 10일땐 "열살"로 가져오고,

20일 땐 "스무살",

나머지는 "기타"로 가져옴.

그렇게 문자열로 가져옴.

 

결과는 잘 나왔고,

s = 열살
s = 스무살
s = 기타
s = 기타

 

/* select
    case 
        when member1.age = ?1 
            then ?2 
        when member1.age = ?3 
            then ?4 
        else '기타' 
    end 
from
    Member member1 */ select
        case 
            when m1_0.age=? 
                then cast(? as varchar) 
            when m1_0.age=? 
                then cast(? as varchar) 
            else '기타' 
        end 
    from
        member m1_0

나간 쿼리.

 

그 다음

@Test
public void complexCase(){
    List<String> result = query.select(new CaseBuilder()
            .when(m.age.between(0, 20)).then("0~20살")
            .when(m.age.between(21, 30)).then("21~30살")
            .otherwise("기타")).from(m).fetch();

    for (String s : result) {
        System.out.println("s = " + s);
    }
}

저렇게 CaseBuilder라는 걸로 Case를 만들 수 있는 듯.

new CaseBuilder()
            .when(m.age.between(0, 20)).then("0~20살")
            .when(m.age.between(21, 30)).then("21~30살")
            .otherwise("기타")

그럼 분해해서 재사용도 가능하다는 말

 

여튼 보면 문법은

when(조건).then(가져올값)

when의 조건이 참이면 가져올값에 넣은 값을 가져옴.

otherwise는 그 이이외의 값.

if else랑 비슷.

 

s = 0~20살
s = 0~20살
s = 21~30살
s = 기타

 

/* select
    case 
        when (member1.age between ?1 and ?2) 
            then ?3 
        when (member1.age between ?4 and ?5) 
            then ?6 
        else '기타' 
    end 
from
    Member member1 */ select
        case 
            when (m1_0.age between ? and ?) 
                then cast(? as varchar) 
            when (m1_0.age between ? and ?) 
                then cast(? as varchar) 
            else '기타' 
        end 
    from
        member m1_0

근데, 나도 이거는 잘 안쓸 듯.

쓰면 좋을때도 있다고는 하는데, sql문의 역할은 데이터를 가져오는거지 저렇게 계산하는게 아님.

해봤자 필터링 정도로 해야함.

 

이거는 그냥 DB에서 데이터를 가져온 다음에, 애플리케이션에서 가공을 하든 해결을 해야 함.

 

 

'스프링데이터 + JPA > QueryDSL' 카테고리의 다른 글

20. 프로젝션  (0) 2023.11.30
19. 상수, 문자 더하기  (0) 2023.11.30
17. 서브 쿼리  (0) 2023.11.30
16. join fetch  (0) 2023.11.29
15. join on  (0) 2023.11.29