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
が返されます。
コード例でそれを練習するには、最初にテーブルが必要です。 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()
は ELT()
の引数リストから、FIELD()
で指定された位置に文字列を出力します。
たとえば、LEVELS
が 2
の場合、FIELD(LEVELS,1,2,3,4)
は 2
を返します。 2
は FIELD
の 2 番目の引数であるため (ここでは LEVEL
を数えないでください)。
次に、ELT(2, 'Level One', 'Level Two', 'Level Three', 'Level Four')
は、ELT()
の 2 番目の引数である Level Two
を返します ( ここでは FIELD()
を引数として数えます)。
さらに、LEVELS
の値がリストに一致しない場合、IFNULL
はデフォルトの USER_LEVEL
を返します。 このように、ELT
と FIELD
の組み合わせを使用して、MySQL で Oracle の decode()
関数をシミュレートできます。
パフォーマンスと可読性を考慮すると、このソリューションは適切な選択ではないかもしれませんが、MySQL の文字列関数を調べることは良いことです。
もう 1つの注目すべき点は、FIELD()
出力では大文字と小文字が区別されないことです。 これは、FIELD('B','B')
と FIELD('b','B')
の両方が同じ結果 1
を返すことを意味します。