33273


検索画面で設定した項目をもとにpostgreSQLからデータを取ってくる  
という処理をjavascriptで行っています。

以下のようなSQLを発行するとuserIdが"NULL"の場合は全件、"001"の場合は"001"のレコードを取得することができました。

[code]

    var userId = '001';
    var sql = "SELECT * FROM user_info WHERE user_id = COALESCE('"+ userId + "', user_id);";
    
[/code]

これを利用しuserIdに"1"が設定された場合、は"1"で曖昧検索を行い、  
"NULL"が設定された場合は全件検索を行いたいのですが可能でしょうか。

以下のような分岐を使う方法では項目が多い場合などコード量が増えてしまうのでなるべく避けたいです。

[code]

    var sql = "SELECT * FROM user_info "
    if (userId != null) {
       sql = sql + "WHERE user_id ='" + userId + "'";
    }
    
[/code]


CC BY-SA 3.0
2017-03-10T08:24:00.077
33236
2017-05-21T05:05:15.673
2017-03-10T09:13:11.540
18621
21008
question
javascript postgresql
postgreSQLで検索項目がNULL(未設定)でなければ曖昧検索を行う


where句を生成するヘルパー関数を導入するのがよいと思います

[code]

    function whereCondition(colName, value) {
      if (value === null) {
        return '';
      } else {
        return `${colName} = ${value}`;
      }
    }
    
    function whereClause(...whereConditions) {
      whereConditions = whereConditions.filter(Boolean);
      if (whereConditions.length) {
        return `WHERE ${whereConditions.join(' AND ')}`;
      } else {
        return '';
      }
    }
    
    const null_element = null;
    const user_id = 17;
    // need single quote
    const user_name = `'WildChinsuko'`;
    
    // WHERE 
    console.info(
      whereClause(
        whereCondition('does_not_appear', null_element),
        whereCondition('user_id', user_id),
        whereCondition('user_name', user_name)
      )
    );
[/code]

手作りライブラリを使うよりも、しっかりテストがなされたライブラリを利用する方が安心かと思います  
JavaScriptで書かれたSQL Query Builderライブラリはいろいろあると思うので、探してみてください


CC BY-SA 3.0
2017-03-10T09:45:25.667
33240
2017-03-10T09:45:25.667
9796
33236
answer


質問どおりの動作をするSQL文は、次のようになるかと思います。  
(PostgreSQL9.4.5では動作しましたが、標準SQL準拠かどうかは自信がありません)

[code]

    var sql = "SELECT * FROM user_info WHERE 
               CASE '" + userId + "'='null' THEN 'a'='a'
               ELSE user_id LIKE '%" + userId + "%'
               END;";
    
[/code]

SQLのCASE式で条件分岐をかけています。  
\- javascript変数"userId"がnullの場合は「'a'='a'」が条件式となるので全レコード抽出  
\- そうでなければ「user_id LIKE
'%(userIdの内容)%'」が条件式となるので、「(userIdの内容)」を「含む」user_idのレコードを抽出  
となります。

ただし、userIdの内容を厳密にチェックしないとインジェクションし放題ですので、  
SQL文を組み立てる前に不正文字が含まれていないかチェックする処理は必須と思います。  
あるいは、placeholderが利用できるSQL実行環境を選択すべきかと思います。


CC BY-SA 3.0
2017-03-12T09:39:05.580
33273
2017-03-12T09:39:05.580
20098
33236
answer