J’ai ce genre de requête simple qui renvoie un champ entier non nul pour un identifiant donné:
SELECT field1 FROM table WHERE id = 123 LIMIT 1;
La chose est que si l’identifiant n’est pas trouvé, le jeu de résultats est vide. J’ai besoin de la requête pour toujours retourner une valeur, même s’il n’y a pas de résultat.
J’ai cette chose qui marche mais je ne l’aime pas parce qu’elle tourne deux fois la même sous-requête:
SELECT IF(EXISTS(SELECT 1 FROM table WHERE id = 123) = 1, (SELECT field1 FROM table WHERE id = 123 LIMIT 1), 0);
Il retourne soit le champ 1 si la ligne existe, sinon 0. Un moyen d’améliorer cela?
Merci!
Modifiez les commentaires et réponses suivants : oui, il doit s’agir d’une seule requête et je ne peux pas utiliser la méthode count car je n’ai besoin de retourner qu’une seule valeur (FYI j’exécute la requête avec la méthode Java / Spring SimpleJdbcTemplate.queryForLong () ).
MySQL a une fonction pour retourner une valeur si le résultat est nul. Vous pouvez l’utiliser sur une requête entière:
SELECT IFNULL( (SELECT field1 FROM table WHERE id = 123 LIMIT 1) ,'not found');
Comme vous cherchez 1 enregistrement (LIMIT 1), cela fonctionnera.
(SELECT field1 FROM table WHERE id = 123) UNION (SELECT 'default_value_if_no_record') LIMIT 1;
Peut être un moyen pratique d’afficher les valeurs par défaut ou d’indiquer aucun résultat trouvé. Je l’utilise pour les rapports.
Voir aussi http://blogs.uoregon.edu/developments/2011/03/31/add-a-header-row-to-mysql-query-results/ pour savoir comment l’utiliser pour créer des en-têtes dans les rapports.
Vous pouvez inclure count (id). Cela reviendra toujours.
select count(field1), field1 from table where id = 123 limit 1;
Vous pouvez utiliser COALESCE
SELECT COALESCE(SUM(column),0) FROM table
Effectuez une recherche avec LEFT OUTER JOIN
. Je ne sais pas si MySQL autorise les VALUES
inline dans les clauses de jointure, mais vous pouvez avoir un tableau prédéfini à cette fin.