忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

MySQL 文字列から部分文字列を取得する方法について(LEFT、RIGHT、SUBSTRING)

MySQL で文字列から部分文字列を取得する方法として、 LEFT , RIGHT , SUBSTRING 関数があります。

LEFT , RIGHT 関数は指定された文字列の左側および右側から切出し文字数を指定し部分文字列を取得します。
また、SUBSTRING 関数は指定された文字列の切出し開始位置と切出し文字数を指定し、部分文字列を取得します。
これらの関数はマルチバイトセーフなので、全角文字も1文字として扱われます。
なお、 LEFT RIGHT 関数の説明は以下の通りです。

LEFT(str, len)
-- 文字列 str から左側から len 文字分の文字列を返し、引数が NULL である場合は NULL を返します。

RIGHT(str, len)
-- 文字列 str から右側から len 文字分の文字列を返し、引数が NULL である場合は NULL を返します。


-- ※SUBSTRINGは4つの形式があります
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)

-- len 引数を付けない形式では、位置 pos で始まる文字列 str からの部分文字列が返されます。
-- len 引数を付けた形式では、位置 pos で始まる文字列 str からの部分文字列 len 文字長が返されます。 
-- FROM を使用する形式は、標準の SQL 構文です。 
-- また、pos に負の値を使用することもできます。 
-- その場合、部分文字列の先頭は文字列の先頭でなく、文字列の末尾からの pos 文字になります。 
-- この関数のどの形式でも、pos で負の値を使用できます。 pos の値が 0 の場合、空の文字列が返されます。

-- (すべての形式の SUBSTRING() で、部分文字列の抽出が開始される文字列内の最初の文字の位置が 1 とみなされます。)

-- 「https://dev.mysql.com/doc/refman/8.0/ja/string-functions.html からの抜粋です。」


それでは順次、LEFT, RIGHT, SUBSTRING 関数の使用例を示します。

■[LEFT関数]の例

MariaDB [(none)]> SELECT
    ->     LEFT('ABCDEFGH', 2)
    ->    ,LEFT('ABCDEFGH', 10)
    ->    ,LEFT('日本語テスト', 3)
    ->    ,LEFT('日本語テスト', 10)
    ->    ,LEFT(NULL, 10)
    ->    ,LEFT('ABCDEFGH', 0)
    -> ;
+---------------------+----------------------+-------------------------+--------------------------+----------------+---------------------+
| LEFT('ABCDEFGH', 2) | LEFT('ABCDEFGH', 10) | LEFT('日本語テスト', 3) | LEFT('日本語テスト', 10) | LEFT(NULL, 10) | LEFT('ABCDEFGH', 0) |
+---------------------+----------------------+-------------------------+--------------------------+----------------+---------------------+
| AB                  | ABCDEFGH             | 日本語                  | 日本語テスト             | NULL           |                     |
+---------------------+----------------------+-------------------------+--------------------------+----------------+---------------------+
1 row in set (0.00 sec)

確かにマルチバイトの文字も1文字として処理されるのが分かります。
また、文字数が文字列より大きい値が指定されてた場合は指定文字列全てが返されます。
なお、文字数指定が「0」以下の場合は長さ「0」の文字列が返されるのが分かります。


■[RIGHT関数]の例

MariaDB [(none)]> SELECT
    ->     RIGHT('ABCDEFGH', 2)
    ->    ,RIGHT('ABCDEFGH', 10)
    ->    ,RIGHT('日本語テスト', 3)
    ->    ,RIGHT('日本語テスト', 10)
    ->    ,RIGHT(NULL, 10)
    ->    ,RIGHT('ABCDEFGH', 0)
    -> ;
+----------------------+-----------------------+--------------------------+---------------------------+-----------------+----------------------+
| RIGHT('ABCDEFGH', 2) | RIGHT('ABCDEFGH', 10) | RIGHT('日本語テスト', 3) | RIGHT('日本語テスト', 10) | RIGHT(NULL, 10) | RIGHT('ABCDEFGH',0)  |
+----------------------+-----------------------+--------------------------+---------------------------+-----------------+----------------------+
| GH                   | ABCDEFGH              | テスト                   | 日本語テスト              | NULL            |                      |
+----------------------+-----------------------+--------------------------+---------------------------+-----------------+----------------------+
1 row in set (0.02 sec)

確かに LEFT 関数の処理を右側から行った結果になっています。

■[SUBSTRING関数]の例

MariaDB [(none)]> SELECT
    ->     SUBSTRING('ABCDEFGHIJ', 6)          AS '先頭から6番目以降全て'
    ->    ,SUBSTRING('ABCDEFGHIJ' FROM 4)      AS '先頭から6番目以降全て'
    ->    ,SUBSTRING('ABCDEFGHIJ', 3, 6)       AS '先頭から3番目から6文字'
    ->    ,SUBSTRING('ABCDEFGHIJ', -3)         AS '最後から3番目以降全て'
    ->    ,SUBSTRING('ABCDEFGHIJ', -5, 3)      AS '最後から5番目から3文字'
    ->    ,SUBSTRING('ABCDEFGHIJ' FROM -4 FOR 2) AS '最後から4番目から2文字'
    -> ;
+-----------------------+-----------------------+------------------------+-----------------------+------------------------+------------------------+
| 先頭から6番目以降全て | 先頭から6番目以降全て | 先頭から3番目から6文字 | 最後から3番目以降全て | 最後から5番目から3文字 | 最後から4番目から2文字 |
+-----------------------+-----------------------+------------------------+-----------------------+------------------------+------------------------+
| FGHIJ                 | DEFGHIJ               | CDEFGH                 | HIJ                   | FGH                    | GH                     |
+-----------------------+-----------------------+------------------------+-----------------------+------------------------+------------------------+
1 row in set (0.00 sec)











PR

コメント

コメントを書く