データ検索における選択項目の処理方法
- データ検索において、選択項目が10項目以上ある場合の処理方法について悩んでいます。省略されなかった項目だけでデータを選択したい場合、どのように作り込めば良いのか教えてください。
- データ検索において、選択項目が10項目以上ある場合の処理方法について悩んでいます。省略されなかった項目だけでデータを選択する方法についてお教えください。
- データ検索において、選択項目が10項目以上あり、省略されなかった項目だけでデータを選択する方法について教えてください。
- ベストアンサー
多くの選択項目を処理(SELECT)するストアド
多くの選択項目を処理(SELECT)するストアド とあるデータ検索において、選択項目が10項目以上あり各項目の値をパラメータとして受取り、 該当データを返すストアドを検討しています。 項目が省略された場合は Null値がパラメータとして入ってきて、その項目は条件から除外します。 (全ての項目が省略されたら、全てのレコードが返される)下記の様な方法を考えています・・・ ----------------------------------------------------------------- if @para1 is null if @para2 is null if @para3 is null select * from TBL else select * from TBL where koumoku3 = @para3 else if @para3 is null select * from TBL where koumoku2 = @para2 else select * from TBL where koumoku2 = @para2 and koumoku3 = @para3 else if @para2 is null if @para3 is null select * from TBL where koumoku1 = @para1 else select * from TBL where koumoku1 = @para1 and koumoku3 = @para3 else if @para3 is null select * from TBL where koumoku1 = @para1 and koumoku2 = @para2 else select * from TBL where koumoku1 = @para1 and koumoku2 = @para2 and koumoku3 = @para3 ------------------------------------------------------ 三つでも面倒なのに10項目以上では考えられません。 こんな時どのように作り込めばいいのでしょうか 動的ストアドにして where文自体を編集した物を渡す事も考えましたが、 エクセル出力時のパラメーター長の制限(?)で断念しました。 省略されなかった項目だけでデータを選択したいような事は多々あると思うのですが、 そんな時のオーソドックスは方法はどんな方法なんでしょうか? よろしくお願いします。
- SEsyo
- お礼率78% (64/82)
- SQL Server
- 回答数2
- ありがとう数16
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
私の場合は、以下のようにCASEを使って処理しています。 select * from TBL where case when @para1 is not null then @para1 else koumoku1 end = koumoku1 and case when @para2 is not null then @para2 else koumoku2 end = koumoku2 and case when @para3 is not null then @para3 else koumoku3 end = koumoku3 簡潔になると思いますが、如何でしょうか?
その他の回答 (1)
- taka451213
- ベストアンサー率47% (436/922)
こんばんは >エクセル出力時のパラメーター長の制限(?)で断念しました。 これがよくわかりませんが・・・、 SQL Serverなので、「sp_executesql」でやっちゃえばいいかと思います。
お礼
ありがとうございました。 書き忘れたのですが、ACCESSのVBAからストアドを起動するのですが、 ストアドを直接エクセルに出力するとパラメータが150文字前後を境に こけてしまいます。 これを文字数制限と表現しました。
関連するQ&A
- ストアドプロシージャの条件分岐に関して
お世話になります。 以下の環境で開発を行っています。 言語:C#(.NET 2008) DB: SQL Server 2008 C#で作成した画面にて入力された値をパラメータで ストアドプロシージャに渡し、その値がNULLでない場合だけ WHERE句にレコード絞り込み条件を与えるSQL文を 考えているのですが、記述方法がわかりません。 (プロシージャ) --------------------------------------------- DECLARE @param1 = '' -- 画面から渡されるパラメータ1 @param2 = '' -- 画面から渡されるパラメータ2 SELECT * FROM TABLE1 A, TABLE2 B -- (1) IF @param1 IS NOT NULL AND @param2 IS NOT NULL -- ここから WHERE A.COLUMN1 = @param1 AND A.COLUMN2 = @param2 ELSE IF @param1 IS NOT NULL AND @param2 IS NULL WHERE A.COLUMN1 = @param1 ELSE IF @param1 IS NULL AND @param2 IS NOT NULL WHERE A.COLUMN2 = @param2 -- ここまで (2) AND A.COLUMN1 = B.COLUMN1 -- (3) AND A.COLUMN2 = B.COLUMN2 -- (4) ------------------------------------------------ 上記の(1)から(4)までをうまく1つにまとめたかたちで記述することができません。 特に上記(2)の効率のよい正しい記述方法がわかりません。 どなたかご教授願えますか? よろしくお願いいたします。
- 締切済み
- SQL Server
- sqlplusの処理が途中でとまる
oracle10gを使用しています。 sqlplusでいくつかのDDLとDMLを一度にコピーペーストで流しました。一つ一つの処理後にcommit;も入っています。 しかし、最後のDMLで処理がとまってしまい、エラーもでません。内容は以下のようになっています。 insert into tbl_a (select distinct col1,'2006/01/01' from tbl_b where col1 is not null union select distinct col2,'2006/01/01' from tbl_b where col2 is not null union select distinct col3,'2006/01/01' from tbl_b where col3 is not null union select distinct col4,'2006/01/01' from tbl_b where col4 is not null union select distinct col5,'2006/01/01' from tbl_b where col5 is not null union select distinct col6,'2006/01/01' from tbl_b where col6 is not null); COMMIT; この処理を単独で実行すると、成功します。sqlpulsは、実行コマンドの量に制限などあるのでしょうか?なぜ、このようになるかわかりません。ちなみに、コマンドの全文字数は3990目で、処理が停止するのは、3648文字目です。この3648文字目にあたるのが、上記の >select distinct col3,'2006/01/01' の >select disti です。 大変急を要ししています。 よろしくお願いします。
- ベストアンサー
- Oracle
- ストアドのselect文で別テーブルのカウントを取得するには
こんばんは。 以下のようなことをするのにどう記述していいのか わかりません。 入力パラメータ test1,test2に一致するテーブル1のレコードの 項目1と項目2の値と test1,test2に一致するテーブル2のレコードの カウントを 返したいと考えていますがどう記述したら テーブル2のカウントを返せるのかわかりません。 以下、考え中の内容を記述したものです。 テーブルTBL_AとテーブルTBL_Bがある。 TBL_Aの項目はFLD_1,FLD_2,FLD_3 TBL_Bの項目はFLD_1,FLD_2,FLD_3,FLD_4 TBL_AとTBL_Bには同一のフィールドFLD_1,FLD_2があり、 select FLD_1,FLD_2,FLD_3 FROM TBL_A WHERE FLD_1 = test1 AND FLD_2 = test2(select文1) 上記のSQLでTBL_AのFLD_1,FLD_2を取得する ここに、 select count(*) FROM TBL_B WHERE FLD_1 = test1 AND FLD_2 = test2(select文2) このselect文2で取得した値を select文1に接続して値を戻したいのですが やり方がわかりません。 戻したい値はTBL_AのFLD_1,FLD_2,FLD_3とTBL_Bのカウントです。 お分かりになる方教えてください。よろしくお願いします。 なおoracleは9iを使っています。
- ベストアンサー
- Oracle
- SELECT * FROM tbl WHERE a = ?;
SELECT * FROM tbl WHERE a = ?; 上記のSQL文で、?の部分がnullだとWHERE条件を無い状態に(SELECT * FROM tbl) のようにするにはどうすればいいでしょうか?
- 締切済み
- PostgreSQL
- selectの行を共通に使いたい
ストアド・プロシジャーで 入力引数 @INPUT_TYPE int if( @INPUT_TYPE = 1 ) begin select CLM1,CLM2,CLM3 from tableAAA where CLM1=100 else if( @INPUT_TYPE = 2 ) begin select CLM1,CLM2,CLM3 from tableAAA where CLM1=200 end と書くところを select CLM1,CLM2,CLM3 from tableAAA if( @INPUT_TYPE = 1 ) begin where CLM1=100 else if( @INPUT_TYPE = 2 ) begin where CLM1=200 end と書いてselectの行は共通処理としたいのですが、 当然上記のままでは登録時にエラーが発生します。 どなたか、方法をご存知でしたら教えてください。
- ベストアンサー
- SQL Server
- 【初歩】 SELECT文で意図した照会結果が得られない。NULLの扱いは?
var1 var2 ------------- abc null ------------- abc null ------------- abc null ------------- のようになっているテーブルに対して、 (1) select * from mytable where var1 = 'abc' (2) select * from mytable where var1 = 'abc' and var2 is null などとやれば、3件全部照会できますが、 (3) select * from mytable where var1 = 'abc' and var2 != '1' (4) select * from mytable where var1 = 'abc' and var2 != 1 とやっても1件も出てこないのですが、なぜでしょうか? 「NULLだって1ではない」わけだから、3件照会できてくれないと 困るのですが・・・
- ベストアンサー
- MySQL
- ストアドから別のストアドを作成できますか?
パラメータ付きストアドから、そのパラメータを展開したSELECT文のストアドを作成する事は可能でしょうか? アクセスのデータシートビューを表示するにはパラメータがあっても指定出来ないようなんです。 「DoCmd.OpenStoredProcedure」でパラメータ付きのストアドを実行すると、 パラメータ用のインプットボックスが表示されその都度入力しなくてはなりません。 そこで、アクセスから@フィールド名 と @テーブル名 をパラメータとしてストアドを実行し、 ストアドで「SELECT @フィールド名 from @テーブル名」パラメータを展開したSELECT文にして、 別の名前を付けたパラメータ無しのストアドとして登録し、そのストアドを アクセスの「DoCmd.OpenStoredProcedure」で実行すれば、目的のデータシートビューを表示出来ると考えました。 ストアドからストアドを作成できるのでしょうか、可能であれば方法を教えて下さい。
- ベストアンサー
- SQL Server
- SQLのWHERE句を条件によって追加したい
SQLのWHERE句にパラメータで渡された値がnullでない場合は条件に 含めるようにしたいのですが、書き方が分かりません。 CASEを使って書いてもエラーになってしまいます。 SELECT 項目1 ,項目2 FROM テーブル WHERE 条件1 = パラメータ1 AND 条件2 = パラメータ2 -- パラメータ3がnullでない場合は下記条件を付けたい AND 条件3 = パラメータ3 使っているのはpostgresqlです。 よろしくお願いします。
- 締切済み
- PostgreSQL
- php×postgresでのストアド利用について
postgresで作成済みの手続き(ストアド)をphpから呼び出し結果を取得したいです。 ■スキーマ CREATE SCHEMA test AUTHORIZATION postgres; ■テーブル CREATE TABLE test.tbl1 ( item1 char(1), item2 int4 ) WITHOUT OIDS; ■ストアド CREATE OR REPLACE FUNCTION test.proc1(IN in_para1 int2, OUT ot_para1 date, OUT ot_para2 date, OUT ot_para3 date) AS $BODY$declare begin select current_date + in_para1 into ot_para1; select tablename from pg_tables into ot_para2; select * from test.tbl1 into ot_para3; end;$BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION test.proc1(IN in_para1 int2, OUT ot_para1 date, OUT ot_para2 date, OUT ot_para3 date) OWNER TO postgres; サンプル的に下準備をしました。 この後、php側でこのストアドを呼び出すコードを教えて下さい。
- ベストアンサー
- PHP
- MYSQL ストアドプロシージャの記述方法
MYSQLのストアドプロシージャについて分からないことがあり質問させて頂きます。 SQLのwhere句の部分を引数によって条件分で変更させたいと考えています。そこでORACLEの場合は変数にいれて最後に明示的にSQLを発行して いたので可能だったのですが、MYSQLの場合はどういった記述になる のかわかりません。やりたいことは下記のような感じです。 ORACLEの場合は procedure prctest(pc out refcur,a in varchar2,b in varchar2) is sqldata varchar2(1000); whereinfo varchar2(1000); begin sqldata := 'select ID , NAME from testTbl '; if (a IS NOT NULL) then whereinfo := whereinfo || ' acol = a ' ; end if; if (b IS NOT NULL) then if (whereinfo IS NOT NULL) then whereinfo := whereinfo || ' and '; end if; whereinfo := whereinfo || ' acol = b ' ; end if; if (whereinfo IS NOT NULL) then sqldata := sqldata || ' where ' || whereinfo ; end if; open pc for sqldata; (ここでSQLが入ったSQLを発行) end prctest; (抜粋) ストアドをあまり使用したことがなく良い説明ではないかも しれませんが、アドバイスの方頂けたらと思います。 よろしくお願いします。
- 締切済み
- MySQL
お礼
ありがとうございました。 解決しました。