2010-03-17 3 views
2

J'ai une requête qui fait plusieurs appels dans une instruction SELECT à une fonction définie par l'utilisateur. La fonction (vfget) renvoie la valeur de retour de paires clé = valeur contenus dans une chaîne.Optimize requête MySQL pour éviter les appels inutiles à la fonction définie par l'utilisateur

Est-il possible pour la requête de simplement appeler la fonction une fois et le stocker dans une variable afin qu'il puisse être réutilisé dans le même requête?

Actuellement ma requête est:

SELECT 
     CASE WHEN(right(vfget(appmod_params, 'service'), 3) = '_dd' OR right(vfget(appmod_params, 'service'), 3) = '_wp') 
      THEN left(vfget(appmod_params, 'service'), length(vfget(appmod_params, 'service'))-3) 
      ELSE vfget(appmod_params, 'service') 
     END 
FROM ota1003 
LIMIT 10 

Répondre

2
SELECT @vf := vfget(appmod_params, 'service'), 
     case when right(@vf, 3) IN ('_dd', '_wp') 
      then left(@vf, length(@vf) - 3) 
      else @vf 
     end 
from ota1003 
limit 10 

ou ceci:

SELECT case when right(vf, 3) IN ('_dd', '_wp') 
      then left(vf, length(vf) - 3) 
      else vf 
     end 
FROM (
     SELECT vfget(appmod_params, 'service') AS vf 
     FROM ota1003 
     LIMIT 10 
     ) q 

requêtes imbriquées dans MySQL sont mises en mémoire tampon et donc moins efficace, mais avec seulement 10 dossiers cela ne devrait pas être beaucoup d'un problème.

+0

Merci, a parfaitement fonctionné après avoir supprimé l'extra "(" –

+0

Est-il possible d'éviter d'avoir la première sortie de champ dans les résultats? –

+0

@James: enfermez la requête dans une requête imbriquée, mais il sera moins efficace – Quassnoi

Questions connexes