JPA/JPA 기본

44. 조건식. case 등등

sdafdq 2023. 10. 31. 11:17

자바의 switch case 문과 비슷한데,

when이 case고

else가 default

마지막은 end로 조건식 끝이라는 걸 표현해 줘야 함.

 

em.createQuery("select " +
                "case " +
                "when m.age <= 10 then '학생요금'" +
                "when m.age >= 60 then '경로요금'" +
                "else '일반요금'" +
                "end " +
                "from Member m", Member.class)
                .getResultList();

이런 식.

CASE ~ END까지 조건식.

if ~ else랑 비슷하다.

이게 기본 case 식 이고,

 

 

 

단순 case 식

em.createQuery("select " +
                "case t.name " +
                "when '팀A' then '인센티브110%'" +
                "when '팀B' then '인센티브120%'" +
                "else '인센티브105%'" +
                "end " +
                "from Team t", Member.class)
                .getResultList();

뭔가 기본 case식은 if else 느낌이고,

단순 케이스 식은 실제 switch문 느낌.

 

 

Hibernate: 
    /* select
        case t.name 
            when '팀A' then '인센티브110%'
            when '팀B' then '인센티브120%'
            else '인센티브105%'
        end 
    from
        Team t */ select
            case t1_0.name 
                when '팀A' then '인센티브110%' 
                when '팀B' then '인센티브120%' 
                else '인센티브105%' 
            end 
        from
            Team t1_0

나가는 쿼리.

 

case 다음에 참조할 값을 주면 단순 case 식, 이거는 실제 switch 문 처럼 쓰면 됨. case가 when, default가 else

case 다음 참조할 값을 안 주면, 그냥 if else 문 처럼 쓰면됨. when이 else if가 되고, else가 else.

마지막에 end 써야 하고.

 

그리고 case 식 중에 아예 간단한 건 함수로 제공함.

coalesce : 하나씩 조회해서 null이면 두번째 값을 반환. 아니면 값을 반환.

nullif : 두 값이 같으면 null 반환, 다르면 첫번째 값 반환.

 

위 둘이 대칭되는? 그런느낌.

 

select coalesce(m.username, '이름 없는 회원') from Member m

조회해서 null이면 '이름 없는 회원'을 반환. 아니면 그냥 그 값을 반환

List<String> result1 = em.createQuery("select coalesce(m.username, '이름없는 회원') from Member m", String.class)
                .getResultList();

username이 null이면 이름없는 회원으로 가져옴.

Hibernate: 
    /* select
        coalesce(m.username, '이름없는 회원') 
    from
        Member m */ select
            coalesce(m1_0.username,'이름없는 회원') 
        from
            Member m1_0

 

 

select nullif(m.username, '관리자') from Member m

조회해서, 그 값이 '관리자'면 null을 반환. 아니면 그냥 그 값을 반환.

List<String> result1 = em.createQuery("select nullif(m.username, '관리자') from Member m", String.class)
                .getResultList();

username이 '관리자'면 null로 가져옴.

Hibernate: 
    /* select
        nullif(m.username, '관리자') 
    from
        Member m */ select
            nullif(m1_0.username,'관리자') 
        from
            Member m1_0

 

이 두개 외에도 함수들이 몇개 있음. 

JPA 표준이기에 DB종류 상관없이 가능.

 

 

'JPA > JPA 기본' 카테고리의 다른 글

46. 경로 표현식  (0) 2023.11.01
45. JPQL 함수  (0) 2023.10.31
43. JPA 타입 표현과 기타식  (0) 2023.10.31
42. 서브쿼리  (0) 2023.10.31
41. 조인  (0) 2023.10.31