データベース千夜一夜第22回

SQLと関数~文字列関数と日付関数 長谷川裕行
有限会社 手國堂

文字列関数

文字列型の値に対する操作を行い、その結果として文字列型または数値型の値を返します。

多くの文字列関数は、処理対象の文字列を引数に取ります。この場合、文字列は関数内部でvarchar型に変換されます。

また、文字数や文字列内の開始位置を指定する場合、バイト数ではなく(全角/半角にかかわらない)純粋な文字の数を指定することに注意してください。


- 文字数を取得~LEN -

機能:文字列の文字数(バイト数ではなく文字の数)を返します。後ろの空白は数えられません。

書式:LEN(<文字列>)

引数:文字列型の値

戻り値:int型

例:テーブル「商品_mr」から「商品名」フィールドの文字数を表示させます。

  SELECT 商品ID, 品名, LEN(品名) AS 文字数 FROM 商品_mr



単に文字数を取り出すだけの関数ですが、例えば帳票の印字または表示幅が限られているとき、事前に文字数を取得して規定以上になる場合には分割表示したい──といったときに役立ちます。

例:テーブル「商品_mr」から「商品名」フィールドの文字数が12文字以上のレコードを抽出します。

  SELECT 商品ID, 品名 FROM 商品_mr
  WHERE LEN(品名) >= 12




- 文字の切り出し~LEFT/RIGHT -

機能:文字列の左端(LEFT関数)または右端(RIGHT関数)から、指定した文字数分の文字列を返します。

書式:LEFT(<文字列>, <文字数>) / RIGHT(<文字列>, <文字数>)

引数:文字列型の値, 正の整数

戻り値:varchar型

例:テーブル「商品_mr」から「商品名」フィールドの文字数を8文字以内に切り詰めて表示します。

  SELECT 商品ID, LEFT(品名, 8) AS 品名略称 FROM 商品_mr

この関数も、帳票の印字枠幅が限られていて長い文字列を切り捨てなければならないときに役立ちます。




- 空白の削除~LTRIM/RTRIM -

機能:文字列の左端(LTRIM関数)または右端(RTRIM関数)から空白を取り除いた文字列を返します。

書式:LTRIM(<文字列>) / RTRIM(<文字列>)

引数:文字列型の値

戻り値:varchar型

例:テーブル「商品_mr」の「商品名」フィールドから、前後の余分な空白文字を取り除きます。

  SELECT 商品ID, RTRIM(LTRIM(品名)) FROM 商品_mr

単純な手入力ではあまり考えられませんが、OCRカードリーダーなどを使った入力や他のデータベース、あるいはXML文書からデータを読み込んでくるような場合には、文字列の前後に(右詰めや左詰などの制約による)空白が生じることもあります。例えば、先頭に空白のある文字列をアプリケーションで左詰(左寄せ)表示させたい場合、空白が邪魔になってしまいます。そのようなときにこれらの関数で余分な空白を取り除きます。

なお、関数は例のようにネスト(入れ子)構造でも使用できます。例の場合は、先にLTRIM関数で左側の空白を取り除き、その結果の文字列に対してRTRIM関数で右側の空白を取り除いています。




- 大文字/小文字変換~LOWER/UPPER -

機能:アルファベットの大文字を小文字に(LOWER関数)、または小文字を大文字に(UPPER関数)変換します。

書式:LOWER(<文字列>) / UPPER(<文字列>)

引数:文字列型の値

戻り値:varchar型

サンプル・データベースのテーブルにはアルファベットを使っているフィールドがないため、ここでは実例を示せませんが、英語表記の氏名や住所などをすべて大文字に統一したり、姓を大文字、名を小文字に統一するような場合に役立ちます。

例:テーブル「Members」から姓(FamilyName)を大文字、名(PersonalName)を小文字に統一して表示します。

  SELECT
  UPPER(FamilyName) As Name_1,
  LOWER(PersonalName) AS name_2
  FROM Members



- 空白の生成~SPACE -

機能:指定した数のスペース(空白文字)を返します。

書式:SPACE(<数>)

引数:正の整数

戻り値:char型

例:テーブル「商品_mr」から「商品名」フィールドを文字幅30文字で右寄せして表示します。

  SELECT 商品ID, SPACE(30-LEN(品名))+品名 AS 商品名 FROM 商品_mr

「+」記号は文字列を連結する演算子です。詳しくは後述します。この場合は、30桁から「品名」フィールドの文字数を引いた数だけスペースで埋めています。文字列を桁揃えする場合に便利です。




- 文字の置き換え~REPLACE -

機能:指定した文字列を別の文字列に入れ替えます。

書式:REPLACE (<文字列1>, <文字列2>, <文字列3>)

引数:すべて文字列型
<文字列1>の中にある<文字列2>を、すべて<文字列3>で置き換えます。

戻り値:<文字列1>の型(文字列形)

例:テーブル「商品_mr」の「品名」から「~セット」を「~組」に置き換えます。

  SELECT 商品ID, REPLACE(品名, 'セット', '組') FROM 商品_mr




- 桁揃え~STR -

機能:数値を桁揃えした文字列に変換します。

書式:STR(<数値>[,[<桁数> [ ,<小数桁>] ] )

引数
 <数値>:変換元の数値(float型)
 <桁数>:変換後の文字列の桁数。小数点や符号も含まれます。元の数値の桁数より大きい場合、左側は半角スペースで埋められます。
 <小数桁>:変換後の文字列となった数値の小数点以下の桁数です。

基本的に<桁数>は、<数値>の桁数を十分に格納できる大きさを指定します。

戻り値:文字列型(varchar)

例:テーブル「累積売上_fx」から「商品ID」「単価」「金額」の各フィールドを桁揃えして表示します。

  SELECT
  STR(商品ID, 8) AS 商品ID,
  STR(単価,6, 0) AS 単価,
  STR(金額, 8, 0) AS 金額
  FROM 累積売上_fx

数値型のフィールドは、そのまま表示すると小数点以下の値が“.0000”のように表示されます。整数の値では、STR関数でこれを省略する方が自然で見やすくなります。

「商品ID」は6桁の整数ですから、これを8桁の文字列に変換すれば、先頭に2桁のスペースが埋め込まれて右寄せ表示されます。

なお、VBのFormat関数のように3桁ごとの「,」を挿入したり、スペースの代わりに「0」で埋めることはできません。それらの処理は、プログラミング言語の命令を使ってアプリケーションのレベルで再加工する必要があります。STR関数は、結果セットをグリッド(DataGrid)に直接表示する場合の、数値データの簡単な整形に便利です。




- 文字列の検索~CHARINDEX -

機能:文字列の中から指定した文字列を探し、その先頭位置を返します。文字列が見つからなければ0を返します。

書式:CHARINDEX (<文字列1>, <文字列2>[, <開始位置>] )

引数
 <文字列1>:検索する文字列
 <文字列2>:検索される文字列
 <開始位置>」<文字列2>内の検索開始位置

戻り値:int型

例:テーブル「商品_mr」の「品名」フィールドから、文字列「セット」の現れる位置を表示します。

  SELECT
  商品ID,
  品名,
  CHARINDEX('セット', 品名) AS 開始位置
  FROM 商品_mr




- 文字列の置き換え~STUFF -

機能:文字列内の指定した位置から指定した文字数を削除し、そこに別の文字列を挿入します。REPLACEが『指定した文字列パターン』を置き換えるのに対して、STUFFは『指定した位置から指定した文字数』を置き換えます。

書式:STUFF(<文字列1>, <開始位置>, <文字数>, <文字列2>)

引数
 <文字列1>:元の文字列
 <開始位置>:削除と置換の開始位置
 <文字数>:削除する文字数
 <文字列2>:置換文字列

戻り値:文字列型(varchar)

例:テーブル「商品_mr」内の「品名」フィールドが「和食器セット楓」という名前の商品名を「和風食卓セット楓」に変更します。

  SELECT
  商品ID,
  品名 AS 旧品名,
  STUFF(品名, 2, 2, '風食卓') AS 新品名
  FROM 商品_mr
  WHERE 品名 LIKE '和食器%'




- 文字列の並べ替え~REVERSE -

機能:同じ文字列を指定回数繰り返します。

書式:REPLICATE(<文字列>, <回数>)

引数:<文字列>を<回数>で指定した回数繰り返して表示します。

戻り値:文字列型(varchar)

例:テーブル「得意先_mr」から東京都の顧客だけを抽出し、電話番号の下4桁を“****”に置換します。

  SELECT
  お客様ID,
  氏名,
  STUFF(電話, 9, 4, REPLICATE('*', 4)) AS 電話
  FROM 得意先_mr
  WHERE 住所1 LIKE '東京都%'




- 文字列の検索~CHARINDEX -

機能:文字列を逆順に並べ替えます。

書式:REVERSE(<文字列>)

引数:逆順にする文字列

戻り値:文字列型(varchar)

 「東京都」→「都京東」のように左右逆順の文字列が返ってきます。




トップページ
関数の互換性
文字列関数
文字数を取得~LEN
文字の切り出し~LEFT/RIGHT
空白の削除~LTRIM/RTRIM
大文字/小文字変換~LOWER/UPPER
空白の生成~SPACE
文字の置き換え~REPLACE
桁揃え~STR
文字列の検索~CHARINDEX
文字列の置き換え~STUFF
文字列の繰り返し~REPLICATE
文字列の並べ替え~REVERSE
日付関数
+演算子による文字列と日時の加算
あとがき
Copyright © MESCIUS inc. All rights reserved.