LoginSignup
0
0

More than 3 years have passed since last update.

OracleのSQLメモ(その1)

Last updated at Posted at 2020-04-09
  • VARCHAR2は動的にサイズを確保してくれると思っていた.
  • 10桁未満の文字をVARCHAR2(10)にキャストすれば8桁になると勝手に思っていた.
  • キャストした後別のテーブルのVARCHAR2(10)のカラムと比較していたが巧くいかなかった.

  • 以下のようなSQLを実行しても結果が0件だった.

    • MASTER側のカラムUSER_IDは8桁(定義はVARCHAR2(10))、CUSTOM_USERINFOのカラムCUSTOM_USER_IDは10桁になっているが5,6桁目を除けば一致するという仕様になっている.
SELECT * FROM MASTER
  WHERE MASTER.USER_ID IN (
    SELECT CAST(SUBSTR(CUSTOM_USER_ID,1,4)||SUBSTR(CUSTOM_USER_ID,7,10) AS VARCHAR2(10)) FROM CUSTOM_USERINFO
  );
  • もしかしたらVARCHAR2(10)にキャストした時は10文字未満でも10文字になるよう埋められるのではないかと思い実験.

  • VARCHAR2(10)にキャストする.

SELECT '__'||CAST(SUBSTR(CUSTOM_USER_ID,1,4)||SUBSTR(CUSTOM_USER_ID,7,10) AS VARCHAR2(10))||'__' FROM CUSTOM_USERINFO
  • 結果
    • 丁寧に10桁固定になるようで、後ろに2byteの余白あり.
__08299025  __
__08299045  __
  • VARCHAR2(8)にキャストする.
SELECT '__'||CAST(SUBSTR(CUSTOM_USER_ID,1,4)||SUBSTR(CUSTOM_USER_ID,7,10) AS VARCHAR2(8))||'__' FROM CUSTOM_USERINFO
  • 結果
    • 下記のとおり、予想通り.
__08299025__
__08299045__

結論

  • ORACLEのSQLで文字列(VARCHAR2)にCASTするときは文字列長も意識しないと比較に失敗する.

補足

  • 以下が気になる.
    • NUMBER型はどうなるのか
    • CASTするとき動的にサイズを変更できるのか?(余計な空白で埋められるのを防げるのか)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0