2017-09-08 1 views
0

Comme le titre l'indique, je suis en train de réaliser quelque chose comme çaSélectionnez sous requête si une autre sous-requête renvoie true false

SELECT 

(<sub query>) AS some_result, 

some_other_result = CASE WHEN some_result > 0 THEN (<another super heavy subquery>) ELSE NULL END 

FROM some_table 

et la sortie serait quelque chose comme ça

+-----------------------------------------+ 
+ some_result +  some_other_result + 
+-----------------------------------------+ 
+  0   +   NULL  + 
+-----------------------------------------+ 
+  6.7  +  3.182738998  + 
+-----------------------------------------+ 

Je veux faire cela parce que some_result ne se produit pas si souvent, mais quand il le fait, il ralentit ma requête.

J'ai un plan de sauvegarde qui utilise 2 requêtes qui vont atteindre la même chose, mais je voudrais éviter cette approche si possible.

Merci

+0

Utilisez une table dérivée (ou cte). – jarlh

Répondre

1

Vous ne pouvez utiliser some_result dans le niveau supérieur, pas dans la même où il a été affecté. Quelque chose comme:

select 
     a.*, 
     some_other_result = 
          CASE WHEN a.some_result > 0 THEN (<another super heavy 
subquery>) 
          ELSE NULL END 
from 
      (SELECT 
      (<sub query>) AS some_result 
      FROM some_table) a 
+0

'FROM some_table' doit être supprimé. – Serg

+0

@Serg Je crois que c'était juste un exemple simplifié de l'auteur, s'il y a d'autres champs dans le même select excluant 'sub_query',' from some_table' pourrait être nécessaire – Hatik

+0

La question implique retourne une valeur scalaire. Sinon, la requête d'origine échouerait, mais OP dit que cela fonctionne. – Serg