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 |