あいまい検索の作り方
画像のような得意先マスタの照会画面で、得意先名のあいまい検索を可能にしたいです。
ヘルプ等を参考にしながら、範囲式を設定してみましたがうまくできませんでした。
恐らく、色々な方法があるかと存じます。
私は、Microsoft SQL Serverを使用していますが、使用DBによっても作り方が違うのでしょうか…?
恐れ入りますが、作成方法をご教示いただけますと幸いです。
よろしくお願いいたします。

-
当フォーラムで検索キーワードに collate で探してみるといいと思います。

-
nkmtさん
いつもお世話になっております。
DB SQL欄は初めて使用するのですが、参考にさせていただきながら書いてみました。
実行すると、先日教えていただいた空のデータビューイベントを通り、エラーメッセージが出てしまいます。
記述が誤っているのでしょうか。
:B COLLATE Japanese_CI_AI LIKE :I
「:B」が得意先名、「:I」が得意先名のあいまい検索値です。
-
COLLATE Japanese_CI_AI の部分は
COLLATE Japanese_CI_AS がいいと思います。
COLLATE Japanese_CI_AS の意味についてはネット検索すると出てきます。
(半角、全角、大文字、小文字問わずという意味だとおもいます。)
:B COLLATE Japanese_CI_AS :I の :Iの部分には
'%' & ZEN( UPPER ( TRIM( 検索文字 ) ) ) & '%' を格納した変数を指定するといいです。
検索条件に
e工業と入力すると
SQL文のWEHEREで例えると
WHERE 得意先名 COLLATE Japanese_CI_AS LIKE '%E工業%'
みたいな感じの検索になります。 -
あいまい検索で、半角、全角、大文字、小文字を問わずHITして欲しい場合は
得意先名 COLLATE Japanese_CI_AS LIKE '%E工業%' はいいと思いますが
半角、全角、大文字、小文字 を区別して欲しい場合は、この方法は適さないと思います。 -
mariさん、
文字列の「部分一致検索」でしたら、「Magic SQL」欄でLIKE関数を用いるのが一番簡単ですよ。この関数を使用すれば、Magicが適切なSQL文を自動で生成してくれます。ご自分でSQL文を書く必要がなくなります。

(画像はMagic連載購読コーナーより)
-
ちなみにmari様のタスクは、
検索して欲しい文字を入力する部分と
得意先マスタを表示する部分が同一タスクにあるのですね。
この作りも全然しない訳ではありませんが、個人的には、
検索文字を入力するタスクがあって、
そのタスクの下に、データを表示するタスクを作る事の方が多いです。
mari様のタスク構造は
得意先コードか
得意先名を入力したら、
ビュー再表示などのイベント実行は必要だと思います。それと金曜日 17:07に投稿された画像の
先頭文字でのFROM~TO範囲指定では使えますが
文字一致絞りとしては適した使い方ではないです。 -
検索文字が未入力の時は、全件対象になるよう
or :I='' の条件追加も必要だと思います。
親:条件指示タスク
子:結果表示タスク とする事が多いです。
今の作りのまま
V=項目 C変更 検索文字
ビュー再表示 が効くといいのかもしれませんが、
カーソルパーキングも先頭項目に戻ってしまうかもしれません。 -
nkmtさん、tandaさん
コメントありがとうございます。
ページ更新のタイミングが悪く、いったんコメント削除しました。
じっくり読ませていただいて、またご連絡させていただきます。
-
mariさん、
ちなみに、Like 関数がなかった頃は、InStr() 関数を使うしかありませんでしたので、1秒で済む複合部分一致検索が下図のように、9秒も掛かっていました。

(画像はMagic連載購読コーナーより)
それが今や、前のコメントで示したように、Like 関数一発で、わずか1秒で検索が完了します!
複合検索で1秒ですから、単純部分一致検索なら、コンマ数秒の世界ですよ。 -
nkmtさん
お世話になっております。
ご教示いただきました、SQL構文、親子タスク構成、検索値未入力時に全件対象となる条件追加など、参考にさせていただき実現することができました!
大文字小文字などの区別を選べる点も、大変勉強になりました。
ありがとうございました。
tandaさん
お世話になっております。
Magic SQLでの実行方法ですが、時間が足りなくなってしまったので、明日チャレンジしたいと思います。
またご助言いただくかと存じますが、何卒よろしくお願いいたします。
-
mariさん、
Magic SQLはですね、わざわざSQL文を書くのは面倒だという人向けに用意された機能ですので、SQL文をゴリゴリ書くのを厭わないという人であれば、SQL文を直接記述していただいていいですよ。
ただ、せっかくMagicを使っているのですから、Magic固有の機能を用いて、SQL文を自動生成してもらったほうが、開発効率がアップするのは間違いないですよ。
頑張ってください。
-
先の自分の投稿で
COLLATE Japanese_CI_AS の意味についてはネット検索すると出てきます
なんて投稿をしてしまいましたが今回学び直しになりました。
アクセントも今回初めて知りました。CI_AIはそういう事だったのねとか。
ありがとうございました。 -
あいまい検索で
大文字/小文字、全角/半角、ひらがな/カタカナ問わず 見つけてくれます
とご紹介すると喜ばれる事があります。
その場合は、Magic SQL では難しいのかなと思いました。
DB SQL あるいはSQLコマンド の出番になると思います。
Magic SQLで済む場面では、それを用い、
先に述べたような場合は、DB SQLを用い、
GROUPING集計等のSQL文を書くのを厭わずその活用がメリット大な場合、SQLコマンド
のようにそれぞれ適した使い方が用意されておりMagic有難いです。 -
tandaさん、nkmtさん
お世話になっております。
先日、Magic SQLでもあいまい検索を実現することができました!
ありがとうございました。
作成のなかで不思議に思ったのが、DB SQLとMagic SQLともに、ZEN関数やUPPER関数がなくても
大文字/小文字、全角/半角、ひらがな/カタカナ問わず検索ができたことです。
Magicの標準機能なのでしょうか…?
なにかご存じであれば、ご教示お願いいたします。
-
Magic SQLでも例えば abc と検索文字指定して、ABCなどを抽出出来たという事なのでしょうね。
私の予想は外れていたみたいですね。失礼しました。
私もDB SQLも試してみたいと思います。
コメントありがとうございました。 -
思い出しましたが
mariさんのデータベースは
japanese CI Aなんとかで作られていて私は必ず90BIN2で作る違いもあるのかもしれません。
-
nkmtさん
コメントありがとうございます。
恐れ入りますが、90BIN2とはMagic特有の何かでしょうか…?
SQLは全然詳しくないので、ご教示いただけると幸いです。
よろしくお願いいたします。
-
データベースの照合順序で
japanese 90bin2は半角・全角、大文字・小文字等を区別してソート等出来るやつだと思います。 -
mariさん、
> Magicの標準機能なのでしょうか…?
SQL Server側の機能です。
-
tandaさん>SQL Server側の機能というご説明ありがとうございます。
私の回答は抜けがありました。 -
nkmtさん、tandaさん
ご回答いただきありがとうございます。
SQL Serverについても知らないことが多いので、大変勉強になりました。
また何かあれば投稿させていただくかと存じます。
何卒よろしくお願いいたします。
サインインしてコメントを残してください。
コメント
21件のコメント