maikeru666
@maikeru666

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

画面の検索条件がnullの時、その条件をsqlの検索条件として投げたくない

画面の検索条件がnullの時、その条件をsqlの検索条件として投げたくない

画面の入力フォームのいくつかを条件にDB検索を行うのですが、入力フォームに入力されていない条件もべた書きのsqlでは検索条件に入れて検索してしまうのですが、
入力フォームから入力された条件だけでsqlを投げる方法はありますでしょうか。

かつそれをsql外の処理で実行したいです。

sql内にcase when null ~
などのように書くのではなく、sql外での方法はありますでしょうか。

以下一部省略したコードです。
input.~が画面から入力されてきた値です。

該当するソースコード

const parm_list = {
jsCd: `${String(input.search_cd_object.js_cd)}%`,
        // 区分名称
jsMeisho: `%${String(input.search_cd_object.js_meisho)}%`,
        // コード値
jsVal: `${String(input.search_cd_object.js_val)}%`,
        // コード値名称
jsCdMeisho: `%${String(input.search_cd_object.kbn_js_meisho)}%`,
};


const sql_list =
SELECT
        kb.js_cd,
        kb.js_meisho,
        kb.js_val,
        kb.kbn_js_meisho
FROM
        mt_kb_js kb        
WEHER
        kb.js_cd LIKE :jsCd
        AND kb.js_meisho LIKE :jsMeisho
        AND kb.js_val LIKE :jsVal
        AND kb.kbn_js_meisho LIKE :jsCdMeisho
        

例えば、
べた書きのSQL内にCASEなどを使って、入力フォームから入力が無かった場合の項目をsqlの条件にしないという方法もありますが、
入力されていない項目をsqlの検索条件にしないという処理をsql外で書くにはどうしたらよいでしょうか。

以下、自分で、バインド変数の中にバインド変数を入れようとしたものですが、うまく行きません。

自分で試してみたこと

const nullkbnCd = String(input.search_cd_object.js_cd);

    let sqljsCd = null;

    if (nulljsCd != null) {
      sqljsCd = `kb.js_cd LIKE :jsCd`;
    }

    const param = {
      coCd: Constant.CO_CD_AB,
      sqljsCd: sqljsCd,
      // 区分コード
      jsCd: `${String(input.search_cd_object.js_cd)}%`,
      // 区分名称
      jsMeisho: `%${String(input.search_cd_object.js_meisho)}%`,
      // コード値
      jsVal: `${String(input.search_cd_object.js_val)}%`,
      // コード値名称
      jsCdMeisho: `%${String(input.search_cd_object.kbn_js_meisho)}%`,
      //購買事業場管理マスタ最大取得件数
      MT_KB_CD_MAXLIMIT: Constant.MT_KB_CD_MAXLIMIT,
    };

    const sql = `
      SELECT
        COUNT(*) AS ct
      FROM
        mt_kb_cd kb
      
      WHERE
        
        AND :sqljsCd
        AND kb.js_meisho LIKE :jsMeisho
        AND kb.js_val LIKE :jsVal
        AND kb.kbn_js_meisho LIKE :jsCdMeisho
     `;

0

1Answer

非常に単純な例ですが、文字列としてSQL文を組み立てます。

let where = '';
if (input.name) {
    where += 'name LIKE :name';
}
0Like

Comments

  1. @maikeru666

    Questioner

    ご回答誠にありがとうございます。

    ifの条件にてブーリアン判定しようとするとエラーになってしまいます。
    111から114行目は何も書かれていません。
    型の問題でしょうか。
    string()だけにしてみたり、input.js![スクリーンショット (165).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620762/154cf3b6-68b1-efca-21f7-7ba5ea43b5ba.png) _cdと囲ってみてもブーリアン判定出来ません。
    よろしくお願いいたします。

  2. スクリーンショットを拝見しましたが、これはスタイルの問題だと思います。
    IF文の条件(a)の両隣に半角スペースが必要、というスタイルのルールついて指摘されているようです。
    これはプログラムの動作には影響しないものですが、実行してもエラーになる、ということでしょうか?そうであればこのスクリーンショットのメッセージとは別の問題だと思います。

  3. @maikeru666

    Questioner

    この赤波線はそういう指摘だったのですね、誠にありがとうございます。
    おかげさまで、無事実装できました。感謝いたします。

Your answer might help someone💌