2010-03-17 9 views
2

我有一個查詢在SELECT語句內對用戶定義函數進行多次調用。函數(vfget)從字符串中包含的key = value對返回值。優化MySQL查詢以避免對用戶定義函數的不必要調用

查詢是否可以只調用一次該函數並將其存儲在一個變量中,以便它可以在同一個查詢中重用?

目前我的查詢是:

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 

回答

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 

或本:

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 

MySQL嵌套查詢緩衝,因此效率較低,雖然只有10條記錄這應該不會有太大的問題。

+0

謝謝,在刪除多餘的「(」 – 2010-03-17 17:01:45

+0

)後完美工作是否可以避免在結果中輸出第一個字段? – 2010-03-17 17:27:24

+0

@James:將查詢包含在嵌套查詢中,但效率較低 – Quassnoi 2010-03-17 17:40:06