MYSQL初心者ですが、よろしくお願いします。
MYSQL(ver5.5)でストアドプロシージャを作成しようと思います。
WEBの検索画面に入力された条件に応じて、WHERE句を動的に作成したいのです。
例えば、WEBの検索画面の検索条件に、
(1)氏名
(2)住所
(3)電話番号
があり、(1)と(3)に入力された場合は、
あるテーブルの検索条件を
WHERE 氏名=入力氏名 AND 電話番号=入力電話番号
のように動的にSQLを作成したいです。
(条件に応じて、静的なSQLを使い分けるやりかたはしたくない)
このような動的なSQLはストアドプロシージャで作成できのでしょうか?
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
ストアドプロシージャ内で、テーブル名やカラム名など識別子を動的に変更することはできません。
create 時に、構文チェックが行われ、テーブル名やカラム名が確定していないとエラーになります。変数を使えるのは、識別子以外のデータ値のみ。
静的select文で、あるデータがnull や空文字列ならそのカラムは条件に使わないようにするなら、where句は次の様に書くとよい
where (case when :x is null or :x ='' then 1 else `a` <=> :x end)
and (case when null <=> :y or :y ='' then 1 else `b` <=> :y end)
and (case when isnull(:z) or :z ='' then 1 else `c` like concat('%', :z, '%') end)
※ null 判定法は、上記の様にMySQLでは3通りの式が使える。
a と b は完全一致、cカラムは、like検索用
ストアドにするまでもないとおもうけど、プリペアード文にして、:x :y :z を代入してやればよい
回答ありがとうございます。
大変参考になりました。
識別子は動的に変更できないのですね。
よくわかりました。
初心者でプリペアード文がなにものかよくわからなかったので、
調べてみますね。有難うございました。
No.3
- 回答日時:
#2さんのところでロジックはでていますが、
仕様がきめきれていないところがあるので確認すると
氏名、住所、電話番号のどれも入力されていない場合は結果は
全部なのか、ヒットさせないのかがわかりません。
かりに後者だとして、ストアドを使う前提で、サンプルです。
//準備
CREATE TABLE HOGE (ID INT NOT NULL PRIMARY KEY,SIMEI VARCHAR(30),JUSHO VARCHAR(200),DENWA VARCHAR(20));
INSERT INTO HOGE VALUES(1,'sato','tokyo aaa','03-aaa'),
(2,'suzuki','tokyo bbb','03-bbb'),
(3,'takahashi','osaka ccc','06-ccc'),
(4,'tanaka','osaka ddd','06-ddd'),
(5,'ito','aichi eee','052-eee');
//プロシージャ作成
DROP PROCEDURE IF EXISTS OUTPUT_PROCEDURE;
DELIMITER //
CREATE PROCEDURE OUTPUT_PROCEDURE(
IN name VARCHAR(30),
IN address VARCHAR(200),
IN tel VARCHAR(20)
)
BEGIN
SELECT * FROM HOGE WHERE 1
AND (`SIMEI`=name OR name='')
AND (`JUSHO` LIKE CONCAT('%',address,'%') OR address='')
AND (`TEL`=tel OR tel='')
AND NOT (name='' AND address='' AND tel='');
END
//
DELIMITER ;
//コール
CALL OUTPUT_PROCEDURE('','',''); →戻りなし
CALL OUTPUT_PROCEDURE('a','','');→戻りなし
CALL OUTPUT_PROCEDURE('sato','','');→satoさんのデータ
CALL OUTPUT_PROCEDURE('','osaka','');→takahashi,tanakaさんのデータ
回答有難うございます。
すっきりしました。
親切に解説してもらえて、びっくりしています。
とても勉強になります。
また質問したいと思いますので、よろしくお願いします。
No.1
- 回答日時:
where句を大きなくくりで考えればできるのでは
特にand検索なら
where 1
and 条件1
and 条件2
and 条件3 ・・・・
でつないでいけます。
もとのクエリにはwhere 1までを記しておき
あとはプログラムでつないでいけばよいでしょう
回答有難うございます。
参考にさせて頂きます。
今回は、プログラムではなくストアドプロシージャ内で、
動的にSQLを作成したいのです。
引数(1)(2)(3)をそれぞれブランクかどうかチェックして、
ブランクでなければ、yambejpさんの言われるように、
and条件をつなげていくイメージです。
この認識でOKでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
つい集めてしまうものはなんですか?
人間誰もは1つ「やたらこればかり集めてしまう」というものがあるもの。 あなたにとって、つい集めてしまうものはなんですか?
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
昨日見た夢を教えて下さい
たまにすごいドラマチックな夢見ること、ありませんか? 起きてからも妙に記憶に残っているような、そんな夢。
-
「お昼の放送」の思い出
小学校から中学校、ところによっては高校まで お昼休みに校内放送で、放送委員が音楽とかおしゃべりとか流してましたよね。 最近は自分でもラジオができるようになって、そのクオリティもすごいことになっていると聞きます。
-
データベースのINT型項目にNULLはNG?
MySQL
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mysqlがインストールされている...
-
エラー 1068 (42000): 複数の主...
-
SQLです教えてくださいお願いし...
-
データベースの接続に失敗して...
-
SQLです。下記の問合せを行うク...
-
「重複を間引いた数」をcountし...
-
あってますか?SQL
-
WHERE `年月日` = '晴' OR `年...
-
SQLです教えてくださいお願いし...
-
SQLを作ったのですがうまくいき...
-
(初心者)MySQLやmaraDBで、crea...
-
SQLです教えてくださいお願いし...
-
SQLです教えてください。
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
utf8bomとutf8mb4の違いがいま...
-
「総降水量が100mm以上になる...
-
SQLで漢字名称を都道府県や市区...
-
SQLあってますか?こう?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブルの列数を調べたい
-
group byで最後のレコードを抽...
-
[MySQL]LOAD DATA INFILE一部レ...
-
フレンドリストのようなものを...
-
MYSQLで小数点を表示する場合と...
-
MYSQLのストアドでの動的SQLに...
-
betweenを使うyyyy/mm/ddでの範...
-
select * での表示が崩れる?
-
WHEREなどの条件が多い場合、ど...
-
時間範囲が重複したレコードを...
-
LOAD DATA INFILE で最初のカラ...
-
「VARCHAR(255)」を「text」に...
-
MySQL 改行コードを含む文字列...
-
MySQL AUTO_INCREMENTが最大に...
-
MySQL テーブルの一部のカラム...
-
デモデータを作るために
-
whereの使い方が分からないので...
-
DBの定義のサイズを大きくし過...
-
INDIRECT関数の代替方法は?
-
一部のカラムでdistinctし全て...
おすすめ情報