sql >> データベース >  >> RDS >> Database

SQLでのDECODE関数の使用は何ですか?

    Oracleでは、DECODE関数を使用すると、手続き型のif-then-elseロジックをクエリに追加できます。このブログでは、SQLのDECODE関数を完全に理解することを試みます。 DECODEのさまざまな使用方法とその構文を学習し、例を使用して理解します。ブログの最後まで私たちと一緒にいてください。

    取り上げるトピックは次のとおりです。

    • SQLのDECODE関数とは何ですか?
    • DECODE関数の構文
    • DECODE関数の例

    一つずつ始めましょう。

    SQLのDECODE関数とは何ですか?

    Oracleでは、DECODE関数を使用すると、手続き型のif-then-elseロジックをクエリに追加できます。 DECODEは、式を各検索値と1つずつ比較します。式が検索と等しい場合、対応する結果がOracleデータベースによって返されます。一致するものが見つからない場合は、デフォルトが返されます。デフォルトを省略すると、Oracleはnullを返します。

    引数のタイプは次のとおりです。

    • 数値タイプ (NUMBER、BINARY_FLOAT、またはBINARY_DOUBLE)

    最初の検索結果のペアが数値の場合、Oracleはすべての検索結果式と最初のexprを比較して、数値の優先順位が最も高い引数を見つけ、残りの引数を暗黙的にそのデータ型に変換して、その特定のデータ型を返します。

    >
    • 文字の種類

    exprとsearchが文字データの場合、Oracleはパディングされていない比較セマンティクスを使用してそれらを比較します。 expr、search、および結果は、データ型CHAR、VARCHAR2、NCHAR、またはNVARCHAR2のいずれかになります。返される文字列はVARCHAR2データ型であり、最初の結果パラメータと同じ文字セットです。

    Oracle Databaseは、短絡評価を使用します。 すべての検索値を評価するのではなく、式と比較する前にのみ検索値を評価します。前の検索が式と等しい場合、評価は終了します。

    Oracleは、expr値と検索値を、比較前に最初の検索値のデータ型に変換します。そして、戻り値を最初の結果と同じデータ型に変換します。

    例: 最初の結果のデータ型がCHARの場合、または最初の結果がnullの場合、Oracleは戻り値をデータ型VARCHAR2に変換します。

    Oracleでは、2つのヌルは同等であると見なされます。 exprがnullの場合、Oracleは最初の検索の結果であるNULLを返します。

    DECODE関数に含めることができるコンポーネントの最大数は255です。これには、式、検索、および結果の引数が含まれます。

    DECODE関数は、次のバージョンのOracleまたはPLSQLで使用できます。

    Oracle 12c、Oracle 11g、Oracle 10g、Oracle 9i

    基本的な例:

    次の例では、Oracle DECODE()関数が最初の引数と2番目の引数を比較します。それらは等しいので、関数は文字列「One」である2番目の引数を返します。

    SELECT
    DECODE(1, 1, 'One')
    FROM
    dual;
    

    DECODE関数の構文は次のとおりです。

    DECODE(expression、search、result [、search、result]…[、default(optional)])

    比較する必要のある値。比較する前に、最初の検索値のデータ型に自動的に変換されます。

    検索

    式と比較される値。

    結果

    expression=searchの場合に返される値。

    デフォルト

    一致するものがない場合、DECODE関数はデフォルトを返し、デフォルトを省略すると、関数はNULLを返します。

    DECODE関数の例

    • DECODE関数は、Oracle/PLSQLで次のように使用できます
    SELECT bank_name,
    DECODE(bank_id, 001, 'SBI',
                        002, 'ICICI',
                        003, ‘Dena',
                        'Gateway') result
    FROM banks;
    

    上記のDECODE()ステートメントと同等のIF-THEN-ELSEステートメント:

    IF bank_id = 001 THEN
       result := 'SBI';
    
    ELSIF bank_id = 002 THEN
       result := 'ICICI';
    
    ELSIF bank_id = 003 THEN
       result := 'Dena';
    
    ELSE
       result := 'Gateway';
    
    END IF;
    

    DECODE関数は、各bank_id値を1つずつ比較します。

    • 2つの日付(date1とdate2)を比較するDECODE関数。date1> date2の場合、DECODE関数はdate2を返す必要があります。それ以外の場合、DECODE関数はdate1を返す必要があります
    DECODE((date1 - date2) - ABS(date1 - date2), 0, date2, date1)
    

    date1がdate2より大きい場合、以下の式は0になります。

    (date1 - date2) - ABS(date1 - date2)
    

    上に示した日付の例は、次のように変更することもできます。

    DECODE(SIGN(date1-date2), 1, date2, date1)
    
    • 以下を返すDECODEステートメント:

    hours_of_work <1の場合、0.04を返します
    hours_of_work> =1かつ<5の場合、0.04を返します
    hours_of_work> 5の場合、0.06を返します

    ここでは、範囲ごとに1つの数値に評価される数式を作成する必要があります。

    SELECT emp_name,
    DECODE(TRUNC (( hours_of_work + 3) / 4), 0, 0.04,
                                              1, 0.04,
                                              0.06) as perc_value
    FROM employees;
    

    これはすべてDECODE関数に関するものです。これまでに、この関数がどのように機能し、この関数がどれほど有用であるかを明確に把握している必要があります。ここで、SQLの作業中にIF-ELSEロジックが必要な場合は、いつでもそれらを使用してみてください。この記事がDECODEステートメントの概念に役立つことを願っています。

    MySQLについて詳しく知り、このオープンソースのリレーショナルデータベースについて知りたい場合は、MySQLDBA認定トレーニングをご覧ください。 インストラクター主導のライブトレーニングと実際のプロジェクトの経験が付属しています。このトレーニングは、MySQLを深く理解し、主題をマスターするのに役立ちます。

    質問がありますか? 「SQLのDECODE」のコメントセクションで言及してください 折り返しご連絡いたします。


    1. MySQL5.6でのROOTパスワードのリセット

    2. Strftime()関数がSQLiteでどのように機能するか

    3. 1つのパラメータで複数の値を渡す

    4. PostgreSQLでカテゴリ別に最大日付グループのIDを選択するにはどうすればよいですか?