SQLの暗黙的な型変換

暗黙的な型変換

暗黙的な型変換とは、SQL側の忖度である。

通常プログラミングにおいて二つ以上のデータの比較、代入等が発生した場合、その二つが異なるデータ型であればエラーとなってしまう。



例)

select max(to_date("2021-01-14") , 10) from dual

> これはエラーになる

しかし、ある特定の異なるデータ方の代入、比較、演算においてはエラーが出ない



例)

select to_date("2021-01-01") + 1  from dual

> 2021-01-02

これは

SQLというプログラミング言語が忖度を行い、ユーザーの意向を取り計らってくれるからである。

これを暗黙的な型変換と呼びます。

暗黙的な型変換が失敗するケース

暗黙的な型変換は、変換データが意味を持たない場合に失敗する

例えば次のコードはエラーが発生する



select

    *

FROM

    employees e

where

    e.birthday > '1998-90-90'

理由は、'1998-90-90'を日付に変更しようにも、90月という月も、90日という月も存在しないためである。

よって、次のクエリは実行が可能



select

    *

FROM

    employees e

where

    e.birthday > '1998-01-01'

明示的な型変換

to_char, to_dateは明示的な型変換を行う関数である。

これはJavapythonなどでの"キャスト"に値する

型変換を行う関数は全部で3つ

  • to_char

  • to_date

  • to_number

※日付を数値に、数値を日付に変換する関数は存在しない

日付から文字列を取り出す

to_char関数は日付から好きな形で文字列を取り出すことができます。

例えば次のSQL



select

    sysdate,

    to_char(sysdate, "YYYY/MM/DD HH12:MI:SS")

from dual



> 2021-01-01 14:01:01,

> 2021/01/01 02:01:01



ここで

YYYY : 4桁で「西暦何年」を取り出す

MM : 「何月」を取り出す

DD : 「何日」を取り出す

HH12 : 1-12の形式で時間を取り出す

HH24 : 1-24の形式で時間を取り出す

MI : 「何分」を取り出す

" some string " : 二重引用符は好きな文字列を入れられる。

を示す。

また、-や(, : などの半角記号はそのまま表示される

数値から文字列への変更

数値から文字列への変更もTO_char関数で可能

TO_CHAR関数について(数値から文字列)

「数値書式」を使用して数値を 文字値に変換して戻す。



SELECT SYSDATE - TO_DATE('00-01-01')



>4157.81799

また、「NLS パラメータ」を指定することで、小数点文字や桁 区切り、各国通貨記号、国際通貨記号を指定することもできる。

その際にはは以下の要素を指定できます。

数値の位置(9の数で表示桁数が決まる)

例)99999

結果)1234

先頭の0を表示

例)099999

001234

$の表示

例)$9999999

$1234

通過記号の表示

例)L999999

¥1234

小数点の位置を指定

例)999D999

1.234

指定された位置にカンマを表示

例)999,999

1,234

TO_NUMBER関数について

次のコードはエラーになる



SELECT '\5,000,000' * 2



> エラー

理由は

暗黙の型変換に失敗した(SQLが忖度に失敗した)から

よって、ユーザーからどのように変換するかを手取り足取り教えてあげれば良い



SELECT TO_NUMBER('\5,000,000', 'L9,999,9991) * 2



> 10000000

NVL関数(NULLの取扱について)



NVL(式1, 式2)

NVL関数は、引数の「式1」に指定された値がNULL値以外の場合は「式1」を、NULL 値の場合は「式2」を戻す関数です。

例)「money」列がNULLの時は0として扱う。



SELECT 

    10 + money, 

    10 + NVL (money, 0) 

FROM employees



> NULL,10

NVLを使わずにNULLの足し算を行う場合、いかなる値でもNULLに値がたされた時点でNULLが結果として返されてしまう。

NULV2関数



NVL2(式1, 式2, 式3)

NVL2関数は、引数の「式1」に指定された値がNULL値以外の場合は「式2」を、NULL 値の場合は「式3」を戻す関数

(この関数考えたやつ...orz)

COALESCE関数



COALESCE(式1, 式2 [bgn ...])

COALESCE関数は、引数に指定された式リストを先頭(左側)からチェックし、

「最初 に見つかった NULL 値以外の値」を戻す関数です(すべての式がNULL値の場合、NULL 値 を戻します)。

CASE文

caseで指定した値ごとに処理を振り分けることができる

CASEからENDの間にWHENとTHENの組み合わせを分岐の数だけ入れる。

例)



SELECT ename, sal,

    (CASE 

        WHEN sal < 230000 THEN 'A'

        WHEN sal < 380000 THEN 'B' 

        WHEN sal < 480000 THEN 'C'

        ELSE 'D'

    END) SAL_LEVEL 

FROM 

    employees

ORDER BY 

    sal_level;



備考

title:データ型とその変換について【SQL

description:oracleマスターbronzeのweb問題集です。間違いやすい問題に厳選してあります。

img:https://s3-ap-northeast-1.amazonaws.com/i.schoo/images/class/600x260/3456.jpg

category_script:page_name.startswith("5")

page:https://minegishirei.hatenablog.com/entry/2024/04/30/081032