てぃぐれのプログラマwiki

ワクワクに従う

知らなかった集合演算子のルール【ORACLE】

列名は同じじゃなくても良い

select
    学生番号 as "01",
    性別 as "02"
from
    TT01_学生
union all
select
    学生番号 as "03",
    部活動コード as "04"
from
    TT02_所属部活動

結果:

01 02
2010B0162 1
2010B0163 1
2010B0164 2

データの型とカラム数が一緒の必要がある。無理やり数を合わせる場合は、nullを使おう。

 

ORDER BY句

基本的に集合演算子以降には使えない。


select 学生番号 as "01",
性別 as "02"
from TT01_学生
union all

select 学生番号 as "03",
部活動コード as "04"
from TT02_所属部活動

order by "03"

 

結果:ORA-00904: "03": invalid identifier

 

下記は可能。でも普通、列名は全て合わせるイメージだが。

select 学生番号 as "01",
性別 as "02"
from TT01_学生
union all

select 学生番号 as "03",
部活動コード as "04"
from TT02_所属部活動

order by "01"

 

ORDER句がないUNIONは1列目がASCとして並び替えられる

UNIONが遅い原因の一つになりそう。。

 

UNION寺のNULLは一つの値としてカウントされるため、NULLの重複も弾かれる

NULLのことはいつも片隅に留めておく必要がある。

 

 

 

 

自然結合 NATURAL JOIN 【ORACLE】

Natural JOIN 自然結合

普段使わないが、知識として知っておきたい。

空気を読んで結合してくれる。(列名と型が一緒の場合に結合してくれる。)

でも、シンプルに書けるだけに、コードとしての可読性が落ちそう。

ファンクションメモ【ORACLE】

LEADING

先頭の指定した文字列を削除する

TRIMとセットで書く。

SELECT TRIM(LEADING 'x' FROM 'xxxy') FROM DUAL;

結果:y

 

TRAILING

先頭の指定した文字列を削除する

TRIMとセットで書く。

SELECT TRIM(TRAILING 'x' FROM 'xxyx') FROM DUAL;

結果:xxy

※下記はエラー

SELECT TRIM(TRAILING 'xx' FROM 'xxyx') FROM DUAL;

ORA-30001: trim set should have only one character

date型の扱い方雑にまとめ【ORACLE】

MONTHS_BETWEEN 何ヶ月の差があるかの計算

select MONTHS_BETWEEN('11-DEC-20','11-OCT-20') from dual;

結果: 2

12月- 10月 = 2

 ちなみに

 select MONTHS_BETWEEN('11-DEC-20','10-OCT-20') from dual;

2ヶ月と1日の場合

結果:

2.03225806451612903225806451612903225806

になった。1ヶ月を1にしたときの1日分が計算されているのだろう。

 

DATE型の算術演算

日時 + 数値 = 日時型

日時 -  数値 = 日時型

日時 - 日時 = 数値型 日数が戻される

※下記の演算はできない

日時 + 日時

日時 * 数値

 

DATA型の表記方法変えるにはto_char

SELECT

 TO_CHAR(NEXT_DAY(LAST_DAY(hire_date),6),'YYYYMMDD')

 from employees;

 

※変換にto_dateは使わない