2014-09-06 2 views
3

J'utilise this plugin MySQL pour Node.js. Voici une requête très simple:Requête MySQL via Node.js avec un nombre inconnu de paramètres null

db.query("SELECT * FROM user WHERE first = ? AND last = ?", [req.query.first, req.query.last], function(error, results) { 
    console.log(results); 
}); 

Maintenant, voici le problème: si seulement certains des paramètres de requête sont définis, mais pas tous? Ceci est un cas d'utilisation très courante, donc je suppose que il y a une façon élégante de rendre compte de cela, mais cela est tout ce que je peux sembler venir avec:

var query; 
if (first && !last) { 
    query = "SELECT * FROM user WHERE first = ?"; 
} else if (!first && last) { 
    query = "SELECT * FROM user WHERE last = ?"; 
} else if (first && last) { 
    query = "SELECT * FROM user WHERE first = ? AND last = ?"; 
} 
db.query(query, [req.query.first, req.query.last], function(error, results) { 
    console.log(results); 
}); 

Rédaction d'une requête distincte pour toutes les combinaisons possibles est évidemment une façon grossière de le faire, et n'est vraiment pas très pratique s'il y a plus que quelques paramètres de requête. Existe-t-il un moyen plus élégant (c'est-à-dire concis) de comptabiliser un nombre inconnu de paramètres nuls?

MISE À JOUR

C'est ce qui a fini par travailler pour moi:

db.query("SELECT * FROM user WHERE (:first IS NULL || first = :first) AND (:last IS NULL || last = :last)", {first: req.query.first, last: req.query.last}, function(error, results) { 
    console.log(error); 
}); 

Répondre

4

Cela peut être un peu lourd, mais vous pouvez utiliser cette requête:

query = "SELECT * FROM user WHERE (? IS NULL || first = ?) AND (? IS NULL || last = ?)"; 

juste être sûr au moins un paramètre n'est pas nul (dans la requête ou dans js). ETA: Si vous utilisez le format de paramètre nommé (: param au lieu de?), Cela vous évitera également des répétitions.

+0

C'est exactement ce que je cherchais. Merci! –

0

Générez dynamiquement la requête. Quelque chose comme:

var params = ["first", "last"]; 
var conds = []; 
var args = []; 
var i; 
for (i = 0 ; i < params.length ; i++) 
{ 
    var p = params[i]; 
    if (req.query[p] !== undefined) 
    { 
     conds.push(p+'=?'); 
     args.push(req.query[p]); 
    } 
} 
var query = 'SELECT * FROM user WHERE '+conds.join(' AND '); 
db.query(query,args, etc.); 

Vous devrez gérer le cas où il n'y a pas de conditions (vous devrez choisir si tout ou rien en jeu).

Questions connexes