【SQLの基本】関数①
はじめに
今回の記事ではSQL第4回目の記事になります。
今回はSQLの関数について学習します。
関数といえばメソッドのことですね。rubyでもたくさんのメソッドが用意されています。
- split
- join
- uniq
メソッドそれぞれに複雑な処理がありますが、メソッドを使うことでその複雑な処理を生のコートを書くことなく実行してくれます。
color = "blue,yellow,red" p color.split(",") => ["blue", "yellow", "red"]
このような複雑な処理がメソッドです。SQLにもこのように複雑な処理を簡潔に実行できる関数(メソッド)があります。本記事ではSQLに用意されているいくつかの関数を見ていきましょう。
他のSQLと同様に下記テーブルを使用して説明していきます。
https://www.sejuku.net/blog/72964
LENGTH
LENGTH関数は文字列の長さを抽出できる関数です。返り値は数値になります。
LENGTH(文字列)
// => 文字列の長さの数値
例えば、名前の文字列の長さの各数値を取り出したい場合は以下のようになります。
SELECT LENGTH (名前)AS 名前の長さ FROM game_character
出力結果
名前の長さ -------------------------- | 3 | | 3 | | 3 | | 4 | | 4 |
非常にシンプルに使うことができます。
Rubyでも同名でlength
メソッドという同じように文字列の数を数値であらわしてくれるメソッドがあります。
color = "yellow" p color.length => 6
REPLACE
文字列の一部を別の文字列に置き換える関数です。少し()の中が複雑ですので覚えるまではしっかりと確認して使う方が良さそうです。
REPLACE(文字列,置換前文字列,置換後文字列)
文字列はそのまま「どの文字列を取り出すか」という意味です。今回は職業列を取り出すことにします。
置換前文字列は対象の列の「置き換える文字」を指します。今回は職業列の戦士の「士」を置き換えることにします。
置換後文字列は「どの文字で置き換えるか」を指します。今回は「士」を「闘員」に置き換えるとします。
実際にテーブルの中身を置き換えたいのでUPDATEメソッドを使用して値を更新します。
UPDATE game_character SET 職業 = REPLACE(職業, '士', '闘員') WHERE 職業 = '戦士'
上記を実行すると職業列のカラムの値がもともとは「戦士」であったのが、「戦闘員」に置き換わります。
CONCAT
文字列を連結させる処理を行う関数です。「コンカット」と呼んでいましたが違います。「コンキャット」らしいです笑
構文は以下になります。繋げたい文字列を複数つなげることができます。
CONCAT (文字列, 文字列[, 文字列・・・])
例えば、職業一覧を取り出す時に文字列を全て「職業:[職業名]」としたい場合は以下のように記述します。
SELECT CONCAT('職業:', 職業) AS 職業 FROM game_character
出力結果
職業
--------------------------
| 職業:勇者 |
| 職業:戦士 |
| 職業:戦士 |
| 職業:魔法使い |
| 職業:僧侶 |
上の例はCONCATを使うために無理やり書きましたが、CONCATを使わずに文字列を連結させることもできます。||
を使うことで文字列を連結させることもできます。
SELECT '職業:' || 職業 AS 職業 FROM game_character
出力結果
職業
--------------------------
| 職業:勇者 |
| 職業:戦士 |
| 職業:戦士 |
| 職業:魔法使い |
| 職業:僧侶 |
CAST
型変換をする関数です。
CONCAT は文字列を連結させるため、数値は連結させることができません。下記のSQLはエラーになります。
SELECT CONCAT('Lv:', レベル) AS レベル FROM game_character
ではどうするのかというと、数値を文字列に型変換することで連結ができます。
CAST (変換する値 AS 変換する型)
SQLでは文字列型は「VARCHAR」となります。したがって、以下のように記述します。
SELECT CONCAT('Lv:', CAST(レベル AS VARCHAR)) AS レベル FROM game_character
出力結果
レベル -------------------------- | Lv:30 | | Lv:42 | | Lv:25 | | Lv:60 | | Lv:20 |