質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

Seasar2

Seasar2はJ2EE/Java EEでの大規模な開発を効率良く行なうためのフレームワークです。 必要な設定ファイルを従来のものと比べて少なくし、依存性を分離して記述しています。 そのため、生産性の高いプログラム開発が可能です。

Q&A

解決済

3回答

5599閲覧

検索フォームで複数条件が指定された場合のSQLを動的にしたい

piterata

総合スコア7

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

Seasar2

Seasar2はJ2EE/Java EEでの大規模な開発を効率良く行なうためのフレームワークです。 必要な設定ファイルを従来のものと比べて少なくし、依存性を分離して記述しています。 そのため、生産性の高いプログラム開発が可能です。

0グッド

0クリップ

投稿2020/02/14 09:39

編集2020/02/17 07:25

前提・実現したいこと

初心者PGです。
検索フォームを開発しています。
画面に3つのボタン(SQLでのちのWHERE句の条件になります)があり、
その押下状況(値)によってDBをSELECTし、結果を表示したいです。
DBはSQLServer、言語はJava(Seasar2)です。

・ボタンは「いぬ(value:AA)」「ねこ(value:BB)」「それ以外(value:CC)」の3つです。
・検索しにいくカラム名はanimalCDです。
・ボタンは複数選択可能です。
・この項目は必須項目です。

「いぬ」が選択された場合に発行したいSQL(実際にこの通りに発行したいわけではなく結果をこのSQLで得られる結果にしたいです)

SQL

1select * from ANIMALTABLE where animalCD = 'AA'

「ねこ」が選択された場合に発行したいSQL

SQL

1select * from ANIMALTABLE where animalCD = 'BB'

「それ以外」が選択された場合に発行したいSQL

SQL

1select * from ANIMALTABLE where animalCD NOT IN ('AA','BB')

「それ以外」はvalueを持っていますが、DBのanimalCDには"CC"という値は存在しません。
「いぬ」「ねこ」の2つが選択された場合も両方に該当する結果を表示します。
「いぬ」「ねこ」「それ以外」の3つが選択された場合も然りです。

どのボタンが押されてどの組み合わせにも対応できるよう、SQLを動的にしたいです。

試したこと

該当のSQLファイルを以下のようにしました。
変数animalCdには画面から取得したanimalCdをリストで保持しSQLファイルに渡します。

SQL

1select * from ANIMALTABLE 2where 3/*IF animalCd != null*/ -- 必須項目のためnullの場合は考慮しない 4animalCD IN /*animalCd*/('AA','BB') 5/*END*/ 6/*IF animalCd == "CC"*/ -- 「それ以外」が選択されている場合 7OR animalCD NOT IN ('AA','BB') 8/*END*/

起こっていること、聞きたいこと

animalCdをリストで保持しているからなのか、
/IF animalCd == "CC"/ /END/
のコメント部の条件判定がいつもfalseになり機能しません。
また、この質問を書いていて気が付いたのですが私がやりたいこととしては
条件を「animalCdに"CC"(それ以外)が含まれていた場合」としたいのです。
要は発行されるSQLとしては、「いぬ」「それ以外」が選択された場合

SQL

1select * from ANIMALTABLE 2where 3animalCD IN ('AA') 4OR 5animalCD NOT IN ('AA','BB')

…とされることを想定していました。

SQLファイル内でそんな条件を書くことは可能なのでしょうか。
可能でなければほかにどのようなやり方があるでしょうか。
また、SQLの組み立て方、仕様としてどうなのか?等々ありましたら
是非教えていただければ幸いです。

拙い文章でわかりにくく申し訳ありませんが、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2020/02/14 09:48

[SQL Server]タグを追加されては?
piterata

2020/02/14 09:51

そうでした、失念しておりました。 アドバイスありがとうございます!
CHERRY

2020/02/14 10:57

> Seasar2でのSQLファイルの操作は、/*IF 条件*/ /*END*/で囲い、 条件がtrueならその中の処理を行うような仕様だったと思います。 SQL は、どのように実行させるのでしょうか? ツールやミドルウェアを使っているのであれば、記載してください。
piterata

2020/02/14 11:21

コメントありがとうございます。 私も数日前に初めて見たシステムのためよく理解できていないのですが、おそらく、 >検索、更新処理等を行うSQL文を記述します。 Daoに定義したメソッドを呼び出すと、対応するSQLファイルに記述されているSQL文が発行されます。 作成したSQLファイルはDaoと同じ場所に配置してください。 ※S2DaoにはSQLを自動で生成する機能が用意されているので、SQLファイルがない場合、S2DaoがSQL文を自動生成します。 これだと思います。 以下引用元です。 http://s2dao.seasar.org/ja/s2dao.html#SqlAnnotation
guest

回答3

0

自己解決

みなさま、コメントいただきありがとうございました。

リストの展開のされ方が調べてもどうしてもわからなかったため、
今回は java のほうでリスト内を検索し、「その他」があった場合フラグを立てて
そのフラグも SQL に渡すことで SQL を条件分岐させることにしました。

Seasar2 の情報が少ない中、わざわざ調べていただいたりコメントいただき感謝しております。
とても勉強になりました。
ありがとうございました。

投稿2020/02/19 00:35

piterata

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

@prm に入力値があるとすると

SQL

1declare @prm nvarchar(20) = 'CC'; 2 3select * from ANIMALTABLE 4where 5animalCD = @prm 6or (@prm = 'CC' and animalCD not in ('AA', 'BB'))

Seasar2 は知らないのでテストしてほしいのですが、
検索すると http://s2container.seasar.org/2.4/ja/s2jdbc_manager_sqlfile.html
/prm/という形式で置き換えられるらしいので次のようになるのではないでしょうか?

SQL

1select * from ANIMALTABLE 2where 3animalCD = /*prm*/'' 4or (/*prm/*'' = 'CC' and animalCD not in ('AA', 'BB'))

投稿2020/02/18 02:37

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piterata

2020/02/18 08:29

ご教示いただきありがとうございます。 初心者のため見当違いなことを言っていたら申し訳ないのですが、 その場合、1つのボタンが選択された場合にしか対応できないような気がするのですが 2つ以上が選択された場合はどのようなSQLが発行されるのでしょうか…?
x_x

2020/02/18 08:39

Seasar2 が配列をどのように SQL に展開するのかわからないので、ここは単純に3つのパラメーターに分解して扱ったほうがいいのではないでしょうか? WHERE (@inu = 1 AND animalCD = 'AA') OR (@neko = 1 AND animalCD = 'BB') OR (@etc = 1 AND animalCD NOT IN ('AA','BB'))
piterata

2020/02/18 09:08

なるほど…! 現状、java のほうで画面のパラメタがリスト化されて SQL ファイルに記述された SQL が発行されるため、 SQL を発行する直前でリストを分解する処理を加えてみたいと思います。 何度もお聞きして申し訳ないのですが、 (@inu = 1 AND animalCD = 'AA') の 1 は何を指しているのでしょうか…
x_x

2020/02/18 09:11

SQLで書いた時です。Seasar2 で (/*inu*/0 = 1 AND ...(略 とかになるのではないでしょうか。
piterata

2020/02/18 09:31

とりあえず 1 を代入して null になって落ちるのを防ぐ、ということでしょうか…?
guest

0

SQL

1select * from ANIMALTABLE 2where 3/*IF animalCd != null*/ -- 必須項目のためnullの場合は考慮しない 4animalCD IN /*animalCd*/('AA','BB') 5/*END*/ 6/*IF animalCd == "CC"*/ -- 「それ以外」が選択されている場合 7AND animalCD NOT IN ('AA','BB') 8/*END*/ 9 10 ↓ コメントがううざいので削ってちょっと整形 11 12select * from ANIMALTABLE 13where 14 animalCD IN ('AA','BB') -- 'AA か 'BB' のデータを対象とする 15AND animalCD NOT IN ('AA','BB') -- 'AA でも 'BB' でもないデータを対象とする 16 172つの条件の AND (両方を満たす)という意味ですから、 18そんなデータは存在しないので 0 件のデータが対象になります。

投稿2020/02/14 09:57

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piterata

2020/02/14 10:08

回答、アドバイスありがとうございます。 はじめて質問させていただいたため、大変読みづらく、申し訳ありません…。 Seasar2でのSQLファイルの操作は、/*IF 条件*/ /*END*/で囲い、 条件がtrueならその中の処理を行うような仕様だったと思います。 そのためコメントを外してしまうとSQLが動的に機能しなくなってしまいます… http://s2container.seasar.org/2.4/ja/s2jdbc_manager_sqlfile.html
Orlofsky

2020/02/14 10:15

Seasar2の部分はわかりません。 回答に書いたSQLの部分だけで 'CC' はSELECTの対象外になることが明白です。
piterata

2020/02/14 10:22

そうか、そうですよね。 質問のSQLはORでしたね、すみません。 そしてこの質問がかなりわかりづらかったですね…少し修正します。 ありがとうございます。
piterata

2020/02/14 10:59

アドバイスありがとうございます。 Seasar2を使用した既存システムの改修のため、フレームワークから変更することは現状とても難しいのです…。 EOLしていますし私もどうなのかなと思ってはいるのですが…
Orlofsky

2020/02/17 15:47

>/*IF animalCd == "CC"*/ -- 「それ以外」が選択されている場合 と >OR animalCD NOT IN ('AA','BB') は意味が違います。 ソフトウェアが使われなくなるのは、もっと良い競争相手ができたり、大きな回避できないバグが直らないなどが考えられます。 Seasar2 のバグも疑った方が良いかも?
piterata

2020/02/18 06:34

コメントありがとうございます。 意味が異なるのは承知しているのですが、 検索先のanimalCDには"CC"という値は存在しないため、 「その他」が選択された場合は「いぬ」「ねこ」以外のデータを表示したい、という意味合いでした。 わかりにくく申し訳ありません。 バグも疑ったほうが良いのですね…勉強になります。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問