MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

【MySQL】文字列が10語を超える場合だけドット(省略記号)を追加するクエリの書き方

記事の一覧表示や抜粋テキストの整形など、「文字列が一定の単語数を超えていたら末尾にドットを付けたい」という場面はよくあります。MySQLではCASE文SUBSTRING_INDEX関数を組み合わせることで、この処理をシンプルに実現できます。本記事では、サンプルテーブルの作成から実際のクエリまで順番に解説します。

1. サンプルテーブルの作成

まずはCASE文を使う前提として、以下のようなテーブルを作成しましょう。

mysql> create table DemoTable
-> (
-> Title text
-> );
Query OK, 0 rows affected (0.61 sec)

Titleというカラムを持つ「DemoTable」が作成されました。

2. レコードの挿入

続いて、INSERTコマンドでテスト用のレコードを挿入します。あえて「10語以内の短い文字列」と「10語を超える長い文字列」を混ぜて登録しておくと、挙動の違いが分かりやすくなります。

mysql> insert into DemoTable values('My name is John and this is my first tutorial on MySQL');
Query OK, 1 row affected (0.11 sec)

mysql> insert into DemoTable values('This is Carol and I work on MongoDB');
Query OK, 1 row affected (0.19 sec)

1件目は12語、2件目は8語の文字列です。

3. 登録内容の確認

SELECT文で全レコードを表示して、正しく登録されているか確認しましょう。

mysql> select *from DemoTable;

出力結果

+--------------------------------------------------------+
| Title |
+--------------------------------------------------------+
| My name is John and this is my first tutorial on MySQL |
| This is Carol and I work on MongoDB |
+--------------------------------------------------------+
2 rows in set (0.00 sec)

4. 10語を超える場合にのみドットを追加するクエリ

ここが本題となるポイントです。SUBSTRING_INDEXで先頭から10語分を取り出し、元の文字列と一致するかどうかをCASE文で判定します。一致すればそのまま表示し、一致しなければ(=11語以上あれば)ドットを連結した結果を返します。

mysql> select (case when substring_index(tbl.Title, ' ', 10) = tbl.Title then tbl.Title
-> else concat(substring_index(tbl.Title, ' ', 10), '....................')
-> end) AS AddDots
-> from DemoTable tbl;

クエリの仕組み

  • substring_index(Title, ' ', 10): 区切り文字「スペース」を基準に、先頭から10語分だけ抽出します。
  • CASE WHEN 抽出結果 = 元の文字列: 全体が10語以内だった場合は抽出結果が元の文字列と完全一致するため、そのままTitleを返します。
  • ELSE句: 11語以上ある場合は一致しないため、10語分の文字列にドットを連結して返します。

出力結果

上記のクエリを実行すると、次のような結果になります。

+-------------------------------------------------------------------+
| AddDots |
+-------------------------------------------------------------------+
| My name is John and this is my first tutorial.................... |
| This is Carol and I work on MongoDB |
+-------------------------------------------------------------------+
2 rows in set (0.00 sec)

12語あった1件目のレコードには10語まで表示した後にドットが付与され、8語だった2件目のレコードはそのまま表示されているのが分かります。


まとめ: CASE文とSUBSTRING_INDEXを組み合わせれば、アプリケーション側のロジックを追加せずともSQLだけで「指定した語数を超える文字列のみ省略記号を付ける」処理が可能です。表示件数の多い一覧ページなどで活用すると便利なので、ぜひ試してみてください。

  1. MySQLで14日前より新しい日付のレコードを取得するクエリの書き方

    この記事では、MySQLを使って「14日前より新しい日付」を持つレコードを抽出する方法を解説します。CURDATE()関数とDATE_SUB()関数を組み合わせることで、簡単に目的のデータを取得できます。テーブル作成から順に見ていきましょう。 1. サンプルテーブルの作成 まず、日付を格納するカラムを持つテーブルを作成します。 mysql> create table DemoTable1392 -> ( -> ArrivalDate date -> ); Query OK, 0 rows affected (0.43 sec) 2. レコード

  2. MySQLクエリで特定の行に2つの単語のみが含まれているか確認する方法

    REGEXPを使って2単語のみの行を判定するカラムの値が「スペースで区切られた2つの単語」で構成されているかどうかを確認したい場合、MySQLの正規表現(REGEXP)を使うと簡単に実現できます。基本の構文は以下の通りです。SELECT * FROM テーブル名 WHERE カラム名 REGEXP ^[^ ]+[ ]+[^ ]+$;この正規表現は「スペース以外の文字が1文字以上続く → スペース → 再びスペース以外の文字が1文字以上続き、そこで終わる」というパターンに一致します。つまり、単語がスペース1つで区切られてちょうど2つある行だけを抽出できます。それでは、実際にサンプルテーブルを作成