使用しているバージョン
Firebird 3.0
やりたいこと
氏名(日本 太郎)のように登録されているテーブルAから
ユーザーによる検索条件(日本太郎、日本 太郎、日本 太郎)を抽出するSQLを作成したい
その際、テーブルAや検索条件に含まれているスペースを考慮しないように改修しヒット件数を増やしたい
※テーブルA及び検索条件の氏名の姓名間はスペースなし、半角スペース、全角スペースいずれも考えられる
課題点
思い当たる方法を使用したが、検索時間が長くなってしまうので高速化を行いたい
現在
LIKE句を使用(検索文字列後方のみ曖昧)
SQL
1 WHERE A.NAME LIKE '日本 太郎%'
→日本太郎、日本 太郎で検索した場合はヒットしない
→検索時間は平均0.06s
試したこと
①REPLACE
SQL
1WHERE REPLACE(REPLACE(A.NAME , ' ', ''),' ','') LIKE '日本太郎%'
※LIKE後の文字列は呼び出し元プログラムでREPLACE
→検索時間が平均40sになってしまった
②SIMILAR TOを使用した正規表現
SQL
1WHERE A.NAME SIMILAR TO '( | )?日( | )?本( | )?太( | )?郎%' 2WHERE A.NAME SIMILAR TO '日([[:SPACE:]]| )?本([[:SPACE:]]| )?太([[:SPACE:]]| )?郎%'
→検索時間が平均11s
③LIKE句の条件拡張
SQL
1WHERE A.NAME LIKE '%日%本%太%郎%'
→検索時間が平均9s
スペース以外も引っ張ってしまい検索結果が意図しないものになる可能性がある
質問内容(条件)
既に運用されており、テーブルの構造を変えるのは厳しいと言われておりますので、
Aテーブルに手を入れず、
試したこと以外でデータ量の多いテーブルAから高速でやりたいことを叶える記述方法があれば教えて欲しいです
また、外国人等、A.NAMEには複数のスペースが含まれる場合があります
マルチポストについて
当質問は当質問翌日にQiitaにも投稿させていただいております。
理由:FireBirdがそこまでメジャーなDBではないため、広い範囲で有識者の方に見つけていただくため
片方で解決した際は可能な限り迅速に共有及び質問のクローズをさせていただきますので、何卒ご理解の程よろしくお願い致します。
Qiita:https://qiita.com/suzu_cat_x/questions/0786f04aaa6e8f57c29f
以下質問いただいた内容に対する補足になります。
入力値の制限の有無
ユーザーによる入力、制限は特にありません。
姓名のセパレータのバリエーション(名姓の順や・=などで分けている場合、空白は2つ以上ある可能性など)の明記
姓名のみヒット、名姓の順で入力された場合はヒットしない。
外人の場合は空白が2つ以上存在します。
・=等スペース以外に関しては考慮しない。
該当結果の明確化(例の場合、”大日本 太郎丸”は結果に含まれるべきなのかが不明)
希望する結果は入力値及び登録値それぞれからスペース(半角,全角)を除いた前方一致です。
テーブルに保持しているスペース→全角
ユーザーが入力したスペース→半角
もしくは逆のパターンで異なるスペースが入力された際にヒットしない現象についてのみ解決したいと考えております。
今回はその他は考慮不要でお願い致します。
新規テーブルの追加について
新規テーブルの追加に関しては、最終手段で
現時点ではSQLによる解決方法を探したいと考えております。
(コメント頂いた案を実際に試すのが12/6以降になります、ご了承いただけると幸いです)
回答1件
あなたの回答
tips
プレビュー