
SELECT CASE WHEN MOD(id, 2) != 0 AND id=(SELECT COUNT(*) FROM Seat) THEN id
#가장 큰 id 가 홀수 인 경우 가장 큰 id 값 고정
WHEN MOD(id, 2) != 0 AND id!=(SELECT COUNT(*) FROM Seat) THEN id+1
#가장 큰 id가 홀수 인 경우 나머지 odd ids = id-1
ELSE id-1
#even ids = id=1
END AS id, student
FROM Seat
ORDER BY 1 ASC;
#아래의 경우처럼 사용하면 하나의 row만 반환된다
SELECT CASE WHEN MOD(id, 2) != 0 AND id=COUNT(*) THEN id
WHEN MOD(id, 2) != 0 AND id!=COUNT(*) THEN id+1
ELSE id-1
END AS id, student
FROM Seat
ORDER BY 1 ASC;
## runtime: 394 ms
SELECT s1.id,
COALESCE(s2.student, s1.student) AS student
# coalesce 함수는 null 값이 아닌 첫 번째 값을 불러온다
FROM seat s1
LEFT JOIN
seat s2 ON (s1.id+1)^1-1 = s2.id
#(s1.id+1)^1-1 은 odd id +=1, even id-=1 이 된다
ORDER BY s1.id;
## runtime: 268 ms
cat operator(^) in sql
: ^ operator는 XOR을 뜻한다. 숫자를 binary form으로 바꾸어준 뒤 각 자리에 XOR을 적용시킨 뒤 반환되는 값이다.
예: 2^3 = 1
2 = 010
3 = 011
2^3 = 001 = 1
# 기본 아이디어
# 이렇게 하게 되면, 맨 마지막은 lead 되어 null 값
## 따라서 ifnull 함수 또는 COALESCE 함수 사용
SELECT id, IFNULL(CASE WHEN id%2!=0 #when id is odd
THEN LEAD(student) OVER()
ELSE LAG(student) OVER()
END) AS student
FROM seat
;
## runtime: 371 ms