SQLでテーブルの文字列列を検索する方法

このQ&Aのポイント
  • SQLを使ってテーブルの文字列列を効率的に検索する方法が知りたいです。特定の文字列を含む行を優先的に取得したいです。
  • テーブルの文字列列を効率的に検索するためのSQLの方法が分かりません。特定の文字列を含む行を優先的に取得したいです。
  • SQLでテーブルの文字列列を検索する際、特定の文字列を含む行を優先して取得したいです。どのようなSQLを書けば良いでしょうか?
回答を見る
  • ベストアンサー

あいまい検索について

お世話になっております。 早速ですが、SQLをどう書けばいいかで悩んでおります。 テーブルの文字列(varchar)の列をl検索します。 テーブルA------------------------ ID value 1 abc 2 defghijklmnopqrstu 3 vwxyzabcdefg 上記のようなテーブルです。 このテーブルのvalue列で、以下の文字列をもっともたくさん 含むものから優先で取得したいのです。 "abc"、"fg"、"vw"、"pqr"、"xyz" この場合、 IDが1の列は"abc" IDが2の列は"fg"、"pqr" IDが3の列は"fg"、"abc"、"xyz" のようにそれぞれ1個、2個、3個と含んでいますから。 SQLの結果セットにIDが3,2,1といった順番で含まれるように 取得したいのです。 where句にlikeを使うくらいはわかるのですが、それから先が 思い浮かびません。 どうかお知恵をおかしください。

  • MySQL
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

同じ文字列が複数個有る場合を想定して作ってみました。 SELECT id ,(LENGTH(value)-LENGTH(REPLACE(value,'abc','')))/3 +(LENGTH(value)-LENGTH(REPLACE(value,'fg','')))/2 +(LENGTH(value)-LENGTH(REPLACE(value,'vw','')))/2 +(LENGTH(value)-LENGTH(REPLACE(value,'pqr','')))/3 +(LENGTH(value)-LENGTH(REPLACE(value,'xyz','')))/3 AS 個数 FROM テーブルA ORDER BY 2 DESC

kotokoto_1980
質問者

お礼

nharasawa様 ご回答ありがとうございます。 教えていただいた方法でうまくいきました。 レスポンスも悪くありませんでした。 とても勉強になりました。 ありがとうございます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ちょっと強引ですが、こんな感じでしょうか? select ID,sum(value like '%abc%')+ sum(value like '%fg%')+ sum(value like '%vw%')+ sum(value like '%pqr%')+ sum(value like '%xyz%') AS hit from a group by ID order by hit desc

kotokoto_1980
質問者

お礼

yambejp様 ご回答ありがとうございます。 こういった方法があるのですね。 うーん、勉強になりました。 感謝です!!!

関連するQ&A

  • 文字列の検索 集計

    エクセルデータにて     A      B      C 1  ABC    ○○○    XYZ 2  ABC    ○○○    PQR 3  DEF    ×××    XYZ 4  DEF    ×××    PQR 5  DEF    ×××    HIJ *アルファベット、記号は文字列 において、下記形式にしたい場合はどの様な手法がありますでしょうか?     A      B      C 1  ABC    ○○○    XYZ PQR    2  DEF    ×××    XYZ PQR HIJ その際、Cに表示させる方法は、1)連続形式、2)カンマ区切り、3)別列の追加 が考えられると思いますが、どの形式でも構いません。(理想は2ですが) 初心者質問ですが、宜しくお願いします。

  • 検索の仕方

    下記の場合の検索する方法を教えてください。 テーブル:abc id : キー xyz_id : xyzのキーが入る テーブル:xyz xyz_id : キー xyz_name : 適当な文字 テーブルabcに登録されていないテーブルxyzのxyz_idだけをSELECT文で抜き出したいのです。 大変、くだらない質問で恐縮ですが、よろしくお願いいたします。

  • 検索条件について

    サーバ上にある以下のようにLOAD DATAでデータベースに登録し LOAD DATA INFILE "/home/abc/test001.csv" INTO TABLE test FIELDS TERMINATED BY ','; ENCLOSED BY '"'; 登録することはできたのですが個々テーブル毎では検索できますが 複数のテーブルで検索するとうまく検索できません。 【個々のテーブルは問題なし】 select * from abc where xyz=12345; select * from 123 where xyz=12345; これですと問題なく検索がヒットします。 【複数のテーブルで検索するとうまくいかない】 select * from abc,123 where abc.xyz=123.xyz; これですと検索してもヒットしません。 ちなみにabcのxyzにある項目を「'」で括ると検索できませんでした。 データは"1","12345"でセットしています。 LOAD DATAのやり方が悪いのでしょうか? どなたか教えていただけませんでしょうか。

  • 半角数字を全角数字で検索できるのはなぜ?

    MYSQLの検索について テーブルAAAのitemには半角の「0000」が入っています。 しかし、下記のSQLを実行すると検索されます。 なぜ全角文字を半角として処理するのでしょうか? 検索しないようにするには、どう対処すればよろしいのでしょうか? テーブル構成 TABLE名:AAA id int(11); item varchar(4) utf-8 -> '0000' SQL文 SELECT * FROM AAA WHERE item = '0000'

  • SQL分のWHERE句について

    SQLのWHERE句について ================================== ABC :入力値(2又は5バイトの可変) T.テーブル.フィールド:ABCが格納されているテーブル(格納すると同時に5桁になります。) 例:01(入力値)⇒01000(格納値) ================================== 参照時のWHERE句の作成の仕方を教えてください。 ※検索値が2桁の場合は、格納値5桁の前方2桁一致でHITさせます。  また5桁の場合は、格納値5桁の全一致です。 今考えているのでは、 IF ABC <> "" THEN IF LenB(ABC) = 2 THEN SQL_WHERE = SQL_WHERE & "AND (LEFT(T.テーブル.フィールド,2) = '" & ABC & "' )" ELSEIF SQL_WHERE = SQL_WHERE & "AND (T.テーブル.フィールド = '" & ABC & "')" END IF END IF です。 宜しくお願いします

  • SQL文の実行速度について

    こんにちは。SQLを勉強しています。 質問をさせてください。 Oracleテーブル(test_table:レコード数はかなりあると考えて構いません) にnumber(int),value(varchar), code(varchar)の3つのフィールドが存在 するとします。 今、codeを指定してvalueを取得したいと考えています。 (1)---------------------------- select value from test_table where code='001'; select value from test_table where code='002'; select value from test_table where code='003'; (2)---------------------------- select code, value from test_table where code='001' or code='002' or code='003' (1)と(2)ではどちらが実行速度が速いのでしょうか? 実際に実行すればわかることですが、そういった環境が ないので、確認できません。宜しくお願い致します。

  • 紐付いている3つのテーブルに対しての検索条件の指定がうまくいきません・・。

    紐付いている3つのテーブルに対しての検索条件の指定がうまく書けません。 3つのテーブルが紐付いています。 ・main_tableのIDと、note_id_tableのID ・note_id_tableのnote_IDと、note_value_tableのnote_ID main_table ID, name ----------- 1, aaa 2, bbb 3, ccc 4, ddd 5, eee note_id_table ID, note_ID ----------- 1, 1 1, 2 1, 3 1, 4 3, 5 3, 6 4, 7 4, 8 4, 9 5, 10 note_value_table note_ID, note_value ----------- 1, AAAA1 2, BBBB1 3, CCCC1 4, DDDD1 5, AAAA3 6, EEEE3 7, FFFF4 8, GGGG4 9, HHHH4 10, IIII5 検索の対象にしたいのは、note_valueです。 今まで、「note_valueに検索文字列が含まれている」main_tableのレコードを取得していました。 SELECT main_table.* FROM main_table LEFT JOIN note_id_table ON main_table.id = note_id_table.id LEFT JOIN note_value_table ON note_id_table.note_ID = note_value_table.note_ID WHERE note_value_table.note_value LIKE '%AAA%' 上記クエリだと、note_valueにAAAを含んでいるnote_ID:1,5を持つ、 main_tableのID:1,3のレコード、2件が返ってきます。 これを、検索文字列のNOT検索とAND検索に対応させたいのです。 NOT検索について、 WHERE NOT(note_value_table LIKE '%AAA%') としてみたのですが、main_tableのID:1,3,4,5のレコードが返ってきました。 期待した動作は、main_tableのID:2,4,5でした。 まず、note_value_tableにデータを持っていないmain_table.id:2はNULLのようで、 この条件では無視されてしまうようです。 また、main_table.id:1,3が返ってきてしまうのは、 main_table.id:1に紐付いているnote_IDの内、2,3,4と main_table.id:3に紐付いているnote_IDの内、6に条件が引っかかってしまうようなのです。 AND検索ですが、上記クエリの条件を WHERE note_value_table LIKE '%AAA%' AND note_value_table LIKE '%BBB%' としたところ、0件となってしまいました。 期待した動作は、note_valueにAAAとBBBを含んでいるnote_ID:1を持つ、 main_tableのID:1のレコード、この1件が返ってくることでした。 どうもこの条件だと、一つのnote_valueにAAAとBBBが含まれていないとHITしないようです。 結局JOINしているので、note_valueの数だけ同じmain_tableが前にくっついてるイメージなんですよね。 main_tableのレコード末端に、紐付いているnote_valueのフィールドを横に繋げるか、 紐付いているnote_valueの文字列を連結したものを一つのフィールドとして解釈するようなことができれば 実現できるのかなぁと思いました。 試行錯誤の末に、パフォーマンスが非常に悪いんですが、下記クエリで機能的には実現できたのですが、 これでは使えないので何かいいアイディアなどあればご教授お願いしたいです。 サブクエリを使いたくないというのがあります。 --AAAの検索 JOINする時に検索してしまうようにしてみました。 また、そのためには、note_id_tableからnote_IDを取得できていないとだめなので、 サブクエリ化してみました。 SELECT main_table.* FROM main_table LEFT JOIN note_value_table ON note_value_table.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table LIKE '%AAA%' WHERE note_value_table.note_value IS NOT NULL --AAAのNOT検索 WHERE条件を逆にするだけにしました。 --AAAとBBBの検索 検索条件1つに対して、JOINを増やしていくようにしました。 JOINが増えるのもそうですが、サブクエリも倍になってしまい、 検索条件を増やせば増やすほどパフォーマンスが落ちてしまいます。。 SELECT main_table.* FROM main_table LEFT JOIN note_value_table AS note_value_table1 ON note_value_table1.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table1 LIKE '%AAA%' LEFT JOIN note_value_table AS note_value_table2 ON note_value_table2.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table2 LIKE '%AAA%' WHERE note_value_table1.note_value IS NOT NULL AND note_value_table2.note_value IS NOT NULL

    • ベストアンサー
    • MySQL
  • 件数をカウントして日付でソートするSQL

    こんなテーブルがあったとして、 テーブル名:shohin ------------------- type:文字列 create_date:日付 こんなデータになっていたとして type| create_date ----+----------- abc | 2004/02/01 abc | 2004/02/02 abc | 2004/02/03 hhh | 2004/01/30 xxx | 2004/01/12 xxx | 2004/01/13 xxx | 2004/01/14 xxx | 2004/01/15 xyz | 2004/01/01 xyz | 2004/01/05 このようなデータを出力したいのですが… (typeで集計して、create_dateの一番新しい日付でソート) type | count | create_date -----+-------+----------- abc | 3 | 2004/02/04 -----+-------+----------- hhh | 1 | 2004/01/30 -----+-------+----------- xxx | 4 | 2004/01/15 -----+-------+----------- xyz | 2 | 2004/01/05 これを一発で書くSQLって可能でしょうか? 副問い合わせを使えば出来るような気がするのですが、Group By した結果からさらに最新の日付を取得してソートというのがどうも上手く書けませんでした。 お分りになる方がいらっしゃいましたら、ぜひともご教示願います。

  • 日付型項目のNULLについて(PostgreSQL)

    よろしくお願いします。 下記内容のtest_tableを作成して ---- CREATE TABLE "test_table" ( "id" varchar(10) NOT NULL, "fdate" date ); ---- 下記内容のデータを登録しました。 ---- insert into test_table(id,fdate) values ('abc',NULL); ---- 下記のsqlでデータを取得できませんでした。 どうしてでしょうか? select * from test_table where fdate = NULL;

  • SQLで条件に合うデータの前後に文字をスマート付加

    こんにちは データベース(mdbファイル)で、次のような置き換えをしたいのですが、スマートなやり方をご存じでしたら教えてください。 Membersテーブル id, name, status 1, 田中, 200 2, 鈴木, 300 3, 高橋, 200 4, 中村, 400 Membersテーブルのうち、status が 200 のレコードになっている name の前後に「ABC」と「XYZ」を付加する、という操作です。 置き換え作業後は次のようになります。 Membersテーブル id, name, status 1, ABC田中XYZ, 200 2, 鈴木, 300 3, ABC高橋XYZ, 200 4, 中村, 400 Where status = 200 と指定して、帰ってきたレコードをループさせて、1件ずつUpdateすればできるのですが、そもそもSQLコマンドの時点でスマートにできるのではないかと思い質問した次第です。SQLは詳しくないのですが、意外に柔軟でスマートなことができるようですので。。。 対象のファイルはmdbで、スクリプトはまだ作っていませんが、vbsになるのではないかと思っています。 Windows 7 and 8 64bit MS Accessはありません