質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Firebird

Firebirdは、オープンソースのリレーショナルデータベース管理システムです。オープンソースとしてBorland社が公開したInterBaseから派生したもので、MGAによる高度なトランザクション管理機能を持ちます。

Q&A

解決済

1回答

482閲覧

FireBirdの検索高速化

suzu_cat

総合スコア81

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Firebird

Firebirdは、オープンソースのリレーショナルデータベース管理システムです。オープンソースとしてBorland社が公開したInterBaseから派生したもので、MGAによる高度なトランザクション管理機能を持ちます。

0グッド

0クリップ

投稿2022/12/01 02:49

編集2022/12/05 12:28

使用しているバージョン

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以降になります、ご了承いただけると幸いです)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2022/12/03 04:36

仕様が不明瞭すぎるかと思います。 入力値の制限の有無、姓名のセパレータのバリエーション(名姓の順や・=などで分けている場合、空白は2つ以上ある可能性など)の明記、該当結果の明確化(例の場合、”大日本 太郎丸”は結果に含まれるべきなのかが不明)をお願いいたします。
suzu_cat

2022/12/03 07:34

追記させていただきました。 よろしくお願い致します。
YT0014

2022/12/03 10:44

セパレータに関してですが、二連続は想定する必要があるのでしょうか?
YT0014

2022/12/03 10:56

加えて要件として、別テーブルを作成するのはアリなのでしょうか? アリなら、以下のような方法も考えられます。 別テーブルにAテーブルのIDとNameの空白削除カラムを持つ。 Aテーブルの変更をトリガーに、別テーブルも同時に更新する。 検索は、別テーブル側のカラムで行う。
YT0014

2022/12/05 10:59

>新規テーブルの追加は最終手段で考えています。 まずはSQLでいいアイデアがあればと質問させていただきました。 quitaで上記の回答をされておられるようですが、こちらへも反映してください。
guest

回答1

0

ベストアンサー

絞り込んでからの最終チェックを試されては?

SQL

1 WHERE A.NAME LIKE '日%' AND A.NAME SIMILAR TO '日( | )?本( | )?太( | )?郎%' 2 WHERE A.NAME LIKE '日%' AND REPLACE(REPLACE(A.NAME , ' ', ''),' ','') LIKE '日本太郎%'

投稿2022/12/04 02:54

YT0014

総合スコア1708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzu_cat

2022/12/06 01:30

ありがとうございます! 試したところ、0.09sで期待する結果が取得できました!
YT0014

2022/12/06 02:51

お役立てて何よりです。 quitaへの記述もありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問