Oracle の MySQL のデコード関数に相当するもの

Mehvish Ashiq 2023年6月20日
Oracle の MySQL のデコード関数に相当するもの

このチュートリアルでは、MySQL で Oracle の decode() 関数に相当するものとして使用できる 3つの代替実装を紹介します。 そのために、IF()CASE、および FIELD()ELT() の組み合わせを使用します。

MySQL の Oracle のデコード関数に相当するもの

MySQL には [decode()』 関数がありますが、Oracle の decode() 関数の代替として使用される実装について学習します。

実装に入る前に、MySQL の decode() 関数と Oracle の decode() 関数の違いを理解しておくことをお勧めします。

MySQL decode() vs Oracle decode()

MySQL の decode() 関数は、エンコードされた文字列をデコードし、元の文字列を出力します。 一方、Oracle の decode() 関数は、式をすべての検索項目と 1つずつ比較します。

式が検索値と等しい場合、Oracle データベースは対応する結果を出力します。 Oracle decode() では、一致が見つからない場合はデフォルト値が返され、デフォルト値がない場合は NULL が返されます。

コード例でそれを練習するには、最初にテーブルが必要です。 IDUSERNAME、および 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 |

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()ELT() の引数リストから、FIELD() で指定された位置に文字列を出力します。

たとえば、LEVELS2 の場合、FIELD(LEVELS,1,2,3,4)2 を返します。 2FIELD の 2 番目の引数であるため (ここでは LEVEL を数えないでください)。

次に、ELT(2, 'Level One', 'Level Two', 'Level Three', 'Level Four') は、ELT() の 2 番目の引数である Level Two を返します ( ここでは FIELD() を引数として数えます)。

さらに、LEVELS の値がリストに一致しない場合、IFNULL はデフォルトの USER_LEVEL を返します。 このように、ELTFIELD の組み合わせを使用して、MySQL で Oracle の decode() 関数をシミュレートできます。

パフォーマンスと可読性を考慮すると、このソリューションは適切な選択ではないかもしれませんが、MySQL の文字列関数を調べることは良いことです。

もう 1つの注目すべき点は、FIELD() 出力では大文字と小文字が区別されないことです。 これは、FIELD('B','B')FIELD('b','B') の両方が同じ結果 1 を返すことを意味します。

著者: Mehvish Ashiq
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