SQL入門
SQL基礎問題2:文字列「-nn-」のnnが偶数のみ抽出

SQLの初心者向け入門解説、VBAからデータベースを扱うためのSQLを解説
公開日:2025-10-28 最終更新日:2025-11-03

SQL基礎問題2:文字列「-nn-」のnnが偶数のみ抽出


文字列「-nn-」のnnが偶数のみ抽出するSQL問題です。


SQLの練習用になるべく単純なSQLで済む問題を出します。
SQLの練習として取り組んで見てください。

問題

文字列「-nn-」のnnが偶数のみ抽出
※画像はExcelです。

列「ID」は「 ○○-nnn-mmm 」の形式です。
(nnnやmmmは数値だが桁数は不定、2桁や3桁。)
このとき、
「nnn」が偶数である行だけを抽出するSQL文を作成してください。
テーブル名は任意。
※関数は使い慣れたRDBMSで構いません。


解答SQL

SQLite3
SELECT * FROM TBL01
WHERE (
  SUBSTR(ID, INSTR(ID, '-') + 1, 
    INSTR(SUBSTR(ID, INSTR(ID, '-') + 1), '-') - 1
)) % 2 = 0

SQLの解説
クエリの目的は、ID列に格納されている「○○-nnn-mmm」という形式の文字列のうち、真ん中の要素(nnnの部分)が偶数であるレコードをすべて抽出することです。
  1. フィルタリングの仕組み
    抽出の条件はWHERE句で定義されています。この条件は、ID文字列からnnnの部分を抽出し、それを数値として偶数であるかを判定するものです。
  2. ID文字列からの抽出(SUBSTRとINSTRのネスト)
    まず、複雑にネストされたSUBSTR関数とINSTR関数を使って、ID文字列から2番目のハイフン区切り要素、つまりnnnの部分を特定し、文字列として取り出しています。
    具体的には、ID文字列中の最初のハイフンの次から、2番目のハイフンの直前までを抽出しています。
  3. 偶数判定(CASTと% 2)
    抽出されたnnnの文字列は、次にCAST(... AS INTEGER)によって整数型に変換されます。
    その整数に対して、% 2 = 0という演算が実行されます。この%は剰余(モジュロ)演算子であり、2で割った余りが0であるかを判定しています。
この全体の処理により、nnnの値が奇数の場合はWHERE条件が偽となり、偶数の場合のみ真となって、その行のデータ(SELECT *)が結果として返されます。

Excel
=LET(sql,
"SELECT ID,値 FROM ?tbl WHERE mid(ID,4,instr(4,ID,'-')-4) mod 2 = 0",
QUERY(SUBSTITUTE(sql,"?tbl","[TBL01$A1:B11]"),"なし"))

SQLの解説
このSQLは、
「 ○○-nnn-mmm 」
この「○○」が2桁限定になります。

=LET(sql,
"SELECT ID,値 FROM ?tbl WHERE MID(ID,InStr(ID,'-')+1,InStrRev(ID,'-')-InStr(ID,'-')-1) MOD 2 <>1",
QUERY(SUBSTITUTE(sql,"?tbl","[TBL01$A1:B11]"),"なし"))

SQLの解説
  1. フィルタリングの仕組み
    抽出の条件はWHERE句に定義されており、ID文字列から抽出したnnnの部分を数値として、それが偶数であるか(奇数ではないか)を判定するものです。
  2. ID文字列からの抽出(MID、InStr、InStrRev)
    ここでは、MID関数、InStr関数、およびInStrRev関数が組み合わせて使われています。
    この組み合わせにより、ID文字列の最初のハイフンと最後のハイフンの間に挟まれた部分、すなわちnnnの部分の文字列を正確に特定し、取り出しています。
    InStrRevは文字列を後ろから検索するため、より確実に最後のハイフンの位置を特定できます。
  3. 偶数判定(MOD)
    抽出されたnnnの文字列は、暗黙的または明示的に数値として扱われ、MOD 2 <> 1という演算が実行されます。
    MODは剰余(モジュロ)演算子であり、この条件は「2で割った余りが1ではない」ことを意味します。
    2で割った余りが1となるのは奇数であるため、この条件は偶数である行のみを選択します。
この全体の処理により、IDの中間要素(nnn)が奇数の場合はWHERE条件が偽となり、偶数の場合のみ真となって、その行のIDと値が結果として返されます。


※SQLの作成及び解説には生成AIの助けを借りています。特に解説文においてはAI出力を多く使用しています。





同じテーマ「SQL入門」の記事

分析関数(OVER句,WINDOW句)
「ADO + VBA」でSQLを実行するときのVBAサンプル
SQL基礎問題1:最大在庫数を持つ製品の在庫金額
SQL基礎問題2:文字列「-nn-」のnnが偶数のみ抽出
SQL基礎問題3:文字列の一部をキーにして集計
SQL基礎問題4:2つのテーブルの不一致を抽出
SQL基礎問題5:複数のマスタテーブルの結合
SQL基礎問題6:成績表から教科ごとの点数ベスト3を抽出
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出
SQL基礎問題8:バスケット分析・ペア商品の出現回数
SQL基礎問題9:特定商品購入者の平均購入金額


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ