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で質問しましょう!
似たような質問が見つかりました
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Excel(エクセル) エクセル 条件に合う日付に入力された時間数の合計したい 4 2022/06/17 22:18
- その他(プログラミング・Web制作) 入力フォームへ、データを自動的に入力するプログラム。どうやって作る? 4 2023/01/16 10:24
- MySQL 「utf8mb4_general_ci」はMAMPでは何に当たりますか? 1 2022/06/02 07:45
- Excel(エクセル) Excel 名簿 検索する関数 3 2023/07/25 10:33
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- X(旧Twitter) 【至急】twitterを乗っ取られたのでしょうか? 1 2022/09/08 02:34
- その他(Microsoft Office) EXCELの1行を1枚の用紙にそれぞれ印刷したい。 3 2022/10/10 11:35
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQL AUTO_INCREMENTが最大に...
-
WHEREなどの条件が多い場合、ど...
-
フレンドリストのようなものを...
-
DBエラーの意味
-
LIKEの右側にカラムを指定でき...
-
SQLServerでNULLを挿入したいです
-
スペースによる絞り込み検索をS...
-
SQLステータス:37000について
-
一部のカラムでdistinctし全て...
-
whereで全てを検索する方法
-
now()かCURRENT_TIMESTAMPか
-
End Ifに対応するIfブロックが...
-
複数カラムに対するLIKE文の最適化
-
UNIONする際、片方テーブルしか...
-
INDIRECT関数の代替方法は?
-
Select文で結合した時に、重複...
-
SQL Serverのntext型で一意イン...
-
エクセルかワードで家系図を作...
-
type date にnullをinsert
-
場合の数 中学入試 5枚のカード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブルの列数を調べたい
-
group byで最後のレコードを抽...
-
MYSQLで小数点を表示する場合と...
-
[MySQL]LOAD DATA INFILE一部レ...
-
フレンドリストのようなものを...
-
WHEREなどの条件が多い場合、ど...
-
MYSQLのストアドでの動的SQLに...
-
select * での表示が崩れる?
-
MySQL AUTO_INCREMENTが最大に...
-
MySQL 改行コードを含む文字列...
-
「VARCHAR(255)」を「text」に...
-
MySQL テーブルの一部のカラム...
-
betweenを使うyyyy/mm/ddでの範...
-
MySQLのselect文で、最大ID値の...
-
ここで「INSERT INTO」を使う意...
-
データの暗号化について
-
時間範囲が重複したレコードを...
-
MYSQLのレコードを上書きしたい...
-
誤って削除したIDカラムを復元...
-
INDIRECT関数の代替方法は?
おすすめ情報