MySQL에서 오라클의 디코드 기능과 동일
이 튜토리얼은 MySQL에서 Oracle의 decode()
기능과 동등한 것으로 사용할 수 있는 세 가지 대체 구현을 제시합니다. 이를 위해 IF()
, CASE
및 FIELD()
와 ELT()
의 조합을 사용합니다.
MySQL의 Oracle Decode 기능과 동일
MySQL에는 decode()
기능이 있지만 Oracle의 decode()
기능에 대한 대안으로 사용되는 구현에 대해 알아볼 것입니다.
구현을 시작하기 전에 MySQL decode()
기능과 Oracle decode()
기능의 차이점을 배우는 것이 좋습니다.
MySQL decode()
대 Oracle decode()
MySQL decode()
함수는 인코딩된 문자열을 디코딩하고 원래 문자열을 출력합니다. 반면 Oracle decode()
함수는 식을 모든 검색 항목과 하나씩 비교합니다.
Oracle 데이터베이스는 표현식이 검색 값과 같으면 해당 결과를 출력합니다. Oracle decode()
에서 일치하는 항목이 없으면 기본값이 반환되고 기본값이 없으면 NULL
이 반환됩니다.
코드 예제로 연습하려면 먼저 테이블이 있어야 합니다. 속성으로 ID
, USERNAME
및 LEVELS
가 있는 users
라는 테이블을 생성합니다.
또한 명확하게 학습하기 위해 일부 데이터를 삽입합니다. 이 자습서에서는 아래에 제공된 쿼리를 사용하여 테이블을 만들고 채울 수 있습니다.
예제 코드(테이블 생성 및 채우기):
# Create a table
CREATE TABLE users(
ID INT NOT NULL AUTO_INCREMENT,
USERNAME VARCHAR(45) NOT NULL,
LEVELS INT NOT NULL,
PRIMARY KEY (ID));
# Insert data
INSERT INTO users (USERNAME, LEVELS) VALUES
('mehvishashiq', 1),
('thomas011', 2),
('danielchristopher', 3),
('sairajames', 4);
SELECT * FROM users;
출력:
| ID | USERNAME | LEVELS |
| ---- | ----------------- | ------ |
| 1 | mehvishashiq | 1 |
| 2 | thomas011 | 2 |
| 3 | danielchristopher | 3 |
| 4 | sairajames | 4 |
CASE
를 사용하여 MySQL에서 Oracle의 decode()
기능 시뮬레이션
예제 코드:
SELECT USERNAME,
CASE
WHEN LEVELS = 1 THEN 'Level One'
WHEN LEVELS = 2 THEN 'Level Two'
WHEN LEVELS = 3 THEN 'Level Three'
WHEN LEVELS = 4 THEN 'Level Four'
ELSE 'Beginner Level'
END AS USER_LEVEL
FROM users;
출력:
| USERNAME | USER_LEVEL |
| ----------------- | ----------- |
| mehvishashiq | Level One |
| thomas011 | Level Two |
| danielchristopher | Level Three |
| sairajames | Level Four |
CASE
문은 Oracle의 decode()
기능을 에뮬레이트하고 각 표현식을 모든 검색 값과 비교하여 해당 결과를 반환합니다. 여기에서 일치 항목이 없는 경우 기본값인 Beginner Level
이 반환됩니다.
IF()
를 사용하여 MySQL에서 Oracle의 decode()
기능 시뮬레이션
결과를 이진 값으로 분할하려면 IF()
를 사용할 수 있습니다.
예제 코드:
SELECT USERNAME, IF(LEVELS >= 3,'Top Rates Plus','Top Rated') AS USER_LEVEL from users;
출력:
| USERNAME | USER_LEVEL |
| ----------------- | -------------- |
| mehvishashiq | Top Rated |
| thomas011 | Top Rated |
| danielchristopher | Top Rated Plus |
| sairajames | Top Rated Plus |
FIELD
및 ELT
조합을 사용하여 MySQL에서 Oracle의 decode()
기능 시뮬레이션
예제 코드:
SELECT USERNAME,
IFNULL(ELT( FIELD(LEVELS,1,2,3,4),
'Level One', 'Level Two',
'Level Three', 'Level Four'
),'Beginner Level')
As USER_LEVEL FROM users;
출력:
| USERNAME | USER_LEVEL |
| ----------------- | ----------- |
| mehvishashiq | Level One |
| thomas011 | Level Two |
| danielchristopher | Level Three |
| sairajames | Level Four |
여기서 FIELD()
는 LEVELS
와 일치하는 문자열의 인수 목록 위치를 출력합니다. 이제 ELT()
는 FIELD()
에 의해 지정된 위치에서 ELT()
의 인수 목록에서 문자열을 출력합니다.
예를 들어 LEVELS
가 2
인 경우 FIELD(LEVELS,1,2,3,4)
는 2
를 반환합니다. 2
는 FIELD
의 두 번째 인수이기 때문입니다(여기서 LEVEL
은 계산하지 않음).
그런 다음 ELT(2, 'Level One', 'Level Two', 'Level Three', 'Level Four')
는 ELT()
의 두 번째 인수인 Level Two
를 반환합니다. 여기에서 FIELD()
를 인수로 계산합니다.
또한 IFNULL
은 목록에서 일치하는 LEVELS
값이 없는 경우 기본 USER_LEVEL
을 반환합니다. 이러한 방식으로 ELT
와 FIELD
의 조합을 사용하여 MySQL에서 Oracle의 decode()
기능을 시뮬레이션할 수 있습니다.
이 솔루션은 성능과 가독성을 고려할 때 좋은 선택이 아닐 수 있지만 MySQL의 문자열 기능을 탐색하는 것이 좋습니다.
주목할만한 또 다른 점은 FIELD()
출력이 대소문자를 구분하지 않는다는 것입니다. 이는 FIELD('B','B')
및 FIELD('b','B')
모두 동일한 결과인 1
을 반환함을 의미합니다.