MySQL에서 오라클의 디코드 기능과 동일

Mehvish Ashiq 2023년6월20일
MySQL에서 오라클의 디코드 기능과 동일

이 튜토리얼은 MySQL에서 Oracle의 decode() 기능과 동등한 것으로 사용할 수 있는 세 가지 대체 구현을 제시합니다. 이를 위해 IF(), CASEFIELD()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, USERNAMELEVELS가 있는 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 |

FIELDELT 조합을 사용하여 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()의 인수 목록에서 문자열을 출력합니다.

예를 들어 LEVELS2인 경우 FIELD(LEVELS,1,2,3,4)2를 반환합니다. 2FIELD의 두 번째 인수이기 때문입니다(여기서 LEVEL은 계산하지 않음).

그런 다음 ELT(2, 'Level One', 'Level Two', 'Level Three', 'Level Four')ELT()의 두 번째 인수인 Level Two를 반환합니다. 여기에서 FIELD()를 인수로 계산합니다.

또한 IFNULL은 목록에서 일치하는 LEVELS 값이 없는 경우 기본 USER_LEVEL을 반환합니다. 이러한 방식으로 ELTFIELD의 조합을 사용하여 MySQL에서 Oracle의 decode() 기능을 시뮬레이션할 수 있습니다.

이 솔루션은 성능과 가독성을 고려할 때 좋은 선택이 아닐 수 있지만 MySQL의 문자열 기능을 탐색하는 것이 좋습니다.

주목할만한 또 다른 점은 FIELD() 출력이 대소문자를 구분하지 않는다는 것입니다. 이는 FIELD('B','B')FIELD('b','B') 모두 동일한 결과인 1을 반환함을 의미합니다.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook