MySQLのSUBSTRING_INDEX()関数で引数「count」に負の値を指定した場合の動作
MySQLのSUBSTRING_INDEX()関数では、引数「count」に負の値を指定することができます。この場合、関数は最後の区切り文字から右側(末尾側)へ向かって区切り文字を数え、その位置より右側にある部分文字列を返します。
負のcount値を指定した場合の挙動
通常、countに正の値を指定すると、文字列の先頭(左側)から区切り文字を数え、その区切り文字より前の部分文字列が返されます。一方、負の値を指定すると、文字列の末尾(右側)から区切り文字を数えるようになり、該当する区切り文字より後ろの部分文字列が返されます。
使用例
mysql> Select SUBSTRING_INDEX('www.google.com','.',-2);
+------------------------------------------+
| SUBSTRING_INDEX('www.google.com','.',-2) |
+------------------------------------------+
| google.com |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> Select SUBSTRING_INDEX('www.google.com','.',-1);
+------------------------------------------+
| SUBSTRING_INDEX('www.google.com','.',-1) |
+------------------------------------------+
| com |
+------------------------------------------+
1 row in set (0.00 sec)上記の例では、対象となる文字列は「www.google.com」で、区切り文字として「.」(ドット)を指定しています。
- count = -2 の場合: 右から2番目の区切り文字「.」より右側にある「google.com」が返されます。
- count = -1 の場合: 最後(右から1番目)の区切り文字「.」より右側にある「com」が返されます。
正の値を指定した場合との比較
参考までに、同じ文字列に対して正の値を指定すると、結果は以下のように異なります。
mysql> Select SUBSTRING_INDEX('www.google.com','.',2);
+-----------------------------------------+
| SUBSTRING_INDEX('www.google.com','.',2) |
+-----------------------------------------+
| www.google |
+-----------------------------------------+
1 row in set (0.00 sec)このように、countの符号によって区切り文字を数える方向が変わり、取得できる部分文字列も変わります。ドメイン名やファイルパスなどから末尾の要素だけを取り出したい場合に、負の値を指定する方法が非常に便利です。
-
MySQLで列内の特定の値の出現回数(カウント)を取得する方法
MySQLでは、COUNT(*)関数とWHERE句を組み合わせることで、特定の列に含まれる指定した値の出現回数を簡単に取得できます。この記事では、サンプルテーブルを作成し、実際にクエリを実行しながら手順を解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成しましょう。 mysql> create table DemoTable ( Id int, Name varchar(100) ); Query OK, 0 rows affected (1.40 sec) Id(整数型)とName(可変長文字列型)の2つの列を持つ
-
MySQLで特定の値を持つ列の数をカウントする方法【SUM関数の活用】
はじめにMySQLでは、SUM関数と加算演算子(+)・論理演算子(AND)を組み合わせることで、テーブル内の複数の列に含まれる特定の値(たとえば「1」)の合計個数や、すべての列がその値を持つ行数を簡単に集計できます。本記事では、サンプルテーブルを作成しながら、具体的なSQLクエリの書き方と実行結果をわかりやすく解説します。基本構文特定の値を持つ列の数をカウントする場合、以下のような構文を使用します。selectsum(yourColumnName1 + yourColumnName2 + yourColumnName3 ... N) as `anyAliasName1`,sum(yourCol