お世話になります。
DBからSQLでキーワードによる検索をかけるときですが、
二つ以上のワードがあるときに、一つのキーワードがほかのキーワードと
かぶってしまう場合、例えば゛、『あいうえお』と『いうえ』等で絞り込むと、
結果的に『あいうえお』が含まれるものだけが該当しますが、これを、
『あいうえお』を含み、更にそれ以外にも『いうえ』が含まれるものを
絞り込むには、どうすればよいでしょうか。
つまり、『あいうえお』のみしか含まれないものは該当しないようにする方法です。
現在のSQLは、
(SELECT * FROM xxxx WHERE tablename LIKE '%あいうえお%' AND tablename LIKE '%いうえ%')
のような感じです。
使用しているDBは、MySQL、SQLiteです。
何卒よろしくお願いいたします。
No.5
- 回答日時:
「カンマや空白で区切られたキーワードの羅列から単語検索」ではなくて、「通常の分かち書きされてない日本語文章から、自由単語検索」なのですよね?
英文のように分かち書きされていれば、前後に空白を入れた文字列で like 検索すれば、部分文字列のみのところと、長い文字列のところとは、個別マッチが可能
カラム値 例 ' きー ワード キーワード '
-- カラム値の前後にも区切り文字の空白を入れておくことで、先頭や最後もマッチさせ得る、検索時に、カラム値にも concat で前後に連結してもよいが時間的に無駄が多い。
条件式 例
where `カラム` like '% ワード %' and `カラム` like '% キーワード %'
分かち書きのない状態で、部分単語のみを見つけるには、perlくらいの強力な正規表現検索ができれば、可能かもしれないが、SQLiteは、正規表現検索させるには、ユーザー関数で組み込む必要がある、MySQLの正規表現検索やブール全文検索も、言明(xが前方にないaにマッチ)検索は実装されてないので、No2の方の回答のように、順番変えた組を作ってlike 検索くらいしかなさそう。OracleやpostgreSQL,Accessについてはよく知らない。
回答、ありがとうございます。
やはり、簡単にはできないようですね。
やるとするならば、キーワードを全部つなぎ合わせてORで
探すといった方法しかないみたいです。
丁寧な説明、ありがとうございました。
No.4
- 回答日時:
No3です。
ALLではなくINですね。失礼しました。
IN句を使ってキーワードのいづれかに該当するものを
取り出す、ということです。IN句の基本的な使い方
おわかりだと思いますが。
キーワードが複数あるということならば、ということで
他のテーブルを参照する方法を提案したのですが、
>また、要はユーザからの入力で検索をかけたいので、いちいちテーブルに
>するというのは、少し和漢が感じられます。
ということであれば、
検索キーワードが複数あり、その都度変更されるという
のであれば、Visual Basic、あるいはOffice系のソフト
たとえば、ExcelやAccessなどを使用してテキストボックスなり
他のコントロールなどに入力し、入力したキーワードを
VB、あるいはSQLを使って、SQLでデータを取り出しIN句でフィルタをかける、
あるいは、データベースにデータベースが理解する
SQl文を発行して取り出す、など考えられることはいろいろあります。
セキュリティ、トラフィック制限、使用条件などによって
作り方は変わって来ます。
この回答への補足
う~ん…
INというのは数ある中からひとつでも含まれていれば…という
ことですが、これとはちょっと用途が違います。複数のキーワードが
『全て』含まれていないと意味がないのです。
No.2の方が意味合い的には近いのですが、やはりキーワードが多いほど
条件分が長くなってしまいます。
やはり、簡単にはいかないのでしょうか…。
No.3
- 回答日時:
キーワードがたくさんあるならば、キーワードの
テーブルを作っておき、SQLの中でALLを使って
テーブルのキーワード検索をする、というのは
どうですか。
SELECT * FROM xxxx WHERE カラム名その1 = ALL(SELECT カラム名その2 FROM キーワードテーブル)
ほかにも、SQLエンジンによって方法はあるとは思いますが。
この回答への補足
その方法では、キーワードがかぶっていても、別に検索はできるのでしょうか。
また、要はユーザからの入力で検索をかけたいので、いちいちテーブルに
するというのは、少し和漢が感じられます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INSERT時に発番を行いたい
-
ACCESS 1クエリでの複数ALTER文
-
カラムの存在チェック
-
Viewにインデックスは張れ...
-
データを削除しても表領域の使...
-
Access レコードを追加できませ...
-
検索結果の列数を動的に変更したい
-
datapumpの実行方法について
-
INDEXの無効化
-
CLOB型へのINSERT
-
oracle SYSTEM01.DBF が大きい
-
viewのバックアップ
-
oracleのプライマリ・キー名の変更
-
SQLでスキーマ名(所有者名)の...
-
表領域(users)の中身を整理したい
-
DELETE文でFROM句を省略した場合
-
select insert 句
-
Data Pump で大量データインポ...
-
DBリンク経由の参照について
-
特定のスキーマのテーブルを一...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カラムの存在チェック
-
INSERT時に発番を行いたい
-
ACCESS 1クエリでの複数ALTER文
-
GROUP BY で列名は指定できない...
-
select count(*) の性能
-
Viewにインデックスは張れ...
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
異なるスキーマからデータを抽...
-
CLOB型へのINSERT
-
postgreSQLのint型は桁数指定が...
-
Data Pump で大量データインポ...
-
Access レコードを追加できませ...
-
INDEXの無効化
-
DELETE文でFROM句を省略した場合
-
SQLでスキーマ名(所有者名)の...
-
datapumpの実行方法について
-
ACCESS 複数テーブル・複数フィ...
-
特定のスキーマのテーブルを一...
-
テーブルからのselectにおいて...
おすすめ情報