sqlite3をVC++2013で扱っています。
もしかしたら、単純な方法があるのかもしれないので質問させてください。
DBに渡す文字が'ABC'でDB内のデータ'AB'にHITさせたいと思っています。
現状思いつく方法は
select * from テーブル where キー like 'A%';
select * from テーブル where キー like 'AB%';
select * from テーブル where キー like 'ABC%';
と渡す文字を一文字ずつ増やして検索して
row数が0以上の一番小さい数のデータを取得するという方法しか思いつかないのですが。
何か良い方法はありますでしょうか?
No.5
- 回答日時:
型番-枝番
という形式が固定されているなら、
instrで - を探す→ - みつかったら以降を削除(substr)
型番の桁が決まっているなら
substr(キー,型番の桁数)
等が考えられます。
また、「キー」列を「型番」「枝番」に分けたテーブルにして、使用時に必要なら
「型番」|| '-' || 「枝番」
みたいに連結する、とか。
No.4ベストアンサー
- 回答日時:
すみません。
「ABC から、 AB を探す」
のルールがはっきりしません。
この1例だけ聞くと
「AB をヒットさせたいなら、 ABCから一文字削って AB にして、検索すればいい」
ってなります。でも、そうでは無いですね?
例えば。
キーに AB,ABC があったら、
・ AB, ABC 両方にヒット
・ AB だけヒット
・ ABC だけヒット
のどれなのでしょうか?その理由は?
キーに AB,ABD があったら、
・ AB, ABD 両方にヒット
・ AB だけヒット
・ ABD だけヒット
のどれなのでしょうか?その理由は?
キーに ABC,ABD があったら、
・ ABC, ABD 両方にヒット
・ ABC だけヒット
・ ABD だけヒット
のどれなのでしょうか?その理由は?
キーに ABD,ABE があったら、
・ ABD, ABE 両方にヒット
・ ABD だけヒット
・ ABE だけヒット
・どちらもヒットしない
のどれなのでしょうか?その理由は?
....
等々。この「その理由」を整理して「一般的なルール」にすれば、他の方法も考えやすくなるでしょう。
> row数が0以上の一番小さい数のデータを取得
というのは
R1 = 「select * from テーブル where キー like 'A%';」で抽出される件数
R2 = 「select * from テーブル where キー like 'AB%';」で抽出される件数
R3 = 「select * from テーブル where キー like 'ABC%';」で抽出される件数
の、0でない Rx が最小となる条件を選択する
という意味でよろしいでしょうか?
それだと
R1≧R2≧R3
なのがあきらかなので
select * from テーブル where キー like 'ABC%';
→ ヒットしたら採用して終了
select * from テーブル where キー like 'AB%';
→ ヒットしたら採用して終了
select * from テーブル where キー like 'A%';
→ ヒットしたら採用、ヒットしなければ0件
と、少ない方から実行すれば、全部実行する必要が無い場合があります。
・先頭から一文字ずつ比較し、連続で一致する文字数を求める
・上記の「一致数」の最も多いものを抽出する
というのがルールなら「先頭から一文字ずつ比較し、連続で一致する文字数を求める」関数を作って、MAXの行を抽出する、という方法があります。
この回答への補足
なかなか説明不足ですいません。
あと返事が遅れて申し訳ありません。
上記の方にも書きましたが、
「ある製品の型番ABC000-00で
ABC000の部分共通の情報がDBに入れてあり、
後ろの端数-00が-01になってもDBの情報は共通のまま使える
という状況を想定しています。
なので新たにABC000-01とかABC000-0Bとかの型番が入ってきたら
ABC000の情報をHITさせて出したいのです。」
という状況です。
あまりDBに慣れてないもので
こういった場合って結構あるんじゃないかと思ったので
私の知らない素晴らしい方法が無いかとお尋ねした次第です。
(現在半分諦めて、全型番のDBを作り、そのテーブルを介して共通情報をリンクする案を模索しています)
>と、少ない方から実行すれば、全部実行する必要が無い場合があります。
おお!確かにおっしゃる通りですね。
ありがとうございます。
>・先頭から一文字ずつ比較し、連続で一致する文字数を求める
>・上記の「一致数」の最も多いものを抽出する
>というのがルールなら「先頭から一文字ずつ比較し、連続で一致する文字数を求める」関数を作って、MAXの行を抽出する、という方法があります。
この辺は、やはりSQLでは用意されてはいないんですよね?
No.3
- 回答日時:
事情がよく分からないのですが、正規表現を使ってもダメなのですか?
この回答への補足
ああ、ごめんなさい、返事が遅れました。
ある製品の型番ABC000-00で
ABC000の部分共通の情報がDBに入れてあり、
後ろの端数-00が-01になってもDBの情報は共通のまま使える
という状況を想定しています。
なので新たにABC000-01とかABC000-0Bとかの型番が入ってきたら
ABC000の情報をHITさせて出したいのです。
No.2
- 回答日時:
select * from テーブル where キー like 'A%';
select * from テーブル where キー like 'AB%';
select * from テーブル where キー like 'ABC%';
例を見ると文字列は自由に調整できるみたいですが...
ズバリlike 'AB'にはできないの?
この回答への補足
あるモジュール(DBからデータを抽出する)に渡す引数が’ABC’で
DB内にキーが’AB’のrowが入っている。
’ABC’内に’AB’が入っているのでこれを合致したと判断して’AB’のrowデータを
返したい。
Likeや%を使うと引数の文字数が少ない場合はそのまま使えますが
引数の文字数が多く、それでもHITさせたい場合どうしたものかと考えて
引数の文字を左から順番に増やしてselect文を掛けるを繰り返して
正解を導き出そうとしてこうなっています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESSのSQLで、NULLかNULLでな...
-
オラクルではできるのにSQLSERV...
-
sqlserverで集計結果をUPDATEし...
-
sqlserverでUPDATEできません
-
accessでのリンクテーブルの更新
-
シャープレジスター エラーコード
-
sqlplusでバックスペースが効か...
-
Access2000へのインポートエラー
-
AccessのSQLで、FROM句の構文エ...
-
「マスタ」と「テーブル」の違...
-
3つ以上のテーブルをUNIONする...
-
Accessにインポートしたら並び...
-
データの二重表示の原因
-
Access VBA [リモートサーバー...
-
ACCESS2007 フォーム 「バリア...
-
SELECT時の行ロックの必要性に...
-
エクスポート時の改行コードに...
-
mysql IN句に1データだけ指定...
-
ACCESSでのエクセルインポート...
-
Access 1レコードずつcsvで出力...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSのSQLで、NULLかNULLでな...
-
sqlserverで集計結果をUPDATEし...
-
オラクルではできるのにSQLSERV...
-
アクセス 日付抽出(年月のみ)...
-
AccessのSQLで、FROM句の構文エ...
-
違いを教えてください
-
更新クエリでキー違反
-
sqlserverで同一キー単位で金額...
-
sqlserverで対象のレコードを削...
-
シャープレジスター エラーコード
-
MAX値を条件にデータを取得する...
-
Access2000へのインポートエラー
-
access前月差分クエリ書き換え...
-
ACCESSで複数テーブルを結合し...
-
AccessテーブルでのF6キーにつ...
-
sqlplusでバックスペースが効か...
-
プライマリーキーで同じ値をUPD...
-
片方のテーブルにないデータを...
-
条件付き合計をSQLで
-
Access2つのテーブルの差額を...
おすすめ情報