tools/sqlitedb GLOB を用いた文字列パターンマッチの例
ここでは,文字列検索に関するいくつかのSQLを示す.文字列検索は,データベースにおける重要な操作の一つである.
-
文字列の包含
WHERE句に「属性名 LIKE '%文字列%'」と書く.例えば「WHERE choiki_kanji LIKE '%地割%'」.これは,「属性choiki_kanjiが文字列'地割'を含む」という条件での検索を実行する.%は任意の(0文字以上)文字列とマッチするため
-
簡単なパターンマッチ
「0階」,「1階」,「2階」,「3階」,「4階」,「5階」,「6階」,「7階」,「8階」,「9階」のいずれかという場合は「[0123456789]階」のように半角の括弧「[]」を使用するデータベース管理システムが多い
SQLite 3の場合には「choiki_kanji GLOB '*[0123456789地]階*'」のような記述形式となる.(記述方法はデータベース管理システムによって異なる)
(参考Webページ)http://kawa.at.webry.info/200610/article_8.html
「町域名漢字」が特定文字列を含むという条件での検索
-
「町域名漢字」に「地割」を含むもの
SELECT * FROM zips WHERE choiki_kanji LIKE '%地割%';
「町域名漢字」と「町域名カナ」の括弧書きに関する問い合わせ例
-
「町域名漢字」に「(」と「)」(全角カッコ)をこの順で含み,かつ,「0階」,「1階」,「2階」,「3階」,「4階」,「5階」,「6階」,「7階」,「8階」,「9階」,「地階」のいずれかを含むもの
* パターンマッチの演算子は,データベース管理システムによって異なる.例えば,PostgreSQLの場合には「GLOB」を「~」に置き換えることで,同様の動作を実現できる可能性がある(未確認).ここではSQLite 3での実装について説明する.
SELECT * FROM zips WHERE choiki_kanji GLOB '*(*)*' AND choiki_kanji GLOB '*[0123456789地]階*';
-
「町域名漢字」に「(」と「)」(全角カッコ)をこの順で含まない,かつ,「0階」,「1階」,「2階」,「3階」,「4階」,「5階」,「6階」,「7階」,「8階」,「9階」,「地階」のいずれかを含むもの
SELECT * FROM zips WHERE NOT choiki_kanji GLOB '*(*)*' AND choiki_kanji GLOB '*[0123456789地]階*';
-
上記 1. 以外で,「町域名漢字」に「(」と「)」(全角カッコ)をこの順で含むもの.(すなわち,「町域名漢字」に「(」と「)」(全角カッコ)をこの順で含むが,「0階」,「1階」,「2階」,「3階」,「4階」,「5階」,「6階」,「7階」,「8階」,「9階」,「地階」を含まないもの)
SELECT * FROM zips WHERE choiki_kanji GLOB '*(*)*' AND NOT choiki_kanji GLOB '*[0123456789地]階*';
-
「町域名漢字」に「(」(全角カッコ)を含まないが,「町域名カナ」に「(」(半角カッコ)を含むもの
SELECT * FROM zips WHERE NOT choiki_kanji GLOB '*(*' AND choiki_kana GLOB '*(*';