2016-09-22 34 views
0

我已經在MySQL創建存儲過程:使用功能在MySQL

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_PublicationsByDate`(IN _DateS DATE, IN _DateF DATE) 
BEGIN 

    SELECT 
     CONCAT(EXTRACT(YEAR FROM filed_date), " Q", EXTRACT(QUARTER FROM filed_date)) AS date, 
     count(CONCAT(EXTRACT(YEAR FROM filed_date), " Q", EXTRACT(QUARTER FROM filed_date))) AS count 
    FROM 
     applications 
    WHERE 
     filed_date between _DateS and _DateF 
    GROUP BY 
     CONCAT(EXTRACT(YEAR FROM filed_date), " Q", EXTRACT(QUARTER FROM filed_date)) 
    ORDER BY 
     CONCAT(EXTRACT(YEAR FROM filed_date), " Q", EXTRACT(QUARTER FROM filed_date)); 

END 

我要替換的長碼

CONCAT(EXTRACT(YEAR FROM filed_date), " Q", EXTRACT(QUARTER FROM filed_date)) 
函數調用的

(僞C +еxample +爲方便起見):

char* func(char* date) 
{ 
return CONCAT(EXTRACT(YEAR FROM date), " Q", EXTRACT(QUARTER FROM date)) 
} 

因爲這些長表達式可能會根據外部參數(僞碼e):

DECLARE F FUNCTION; 

IF (_Type = 0) 
    SET F = Func1; 
ELSE 
    SET F = Func2; 
END IF; 

SELECT F(filed_date), count(F(filed_date))... 

如何在mysql中創建它?

+0

的功能'創建function' ...? – Shadow

+0

影子,也許,但如何使用此功能? 它是一個全局函數或本地存儲過程? – Zhihar

+0

您無法在MySQL中的存儲過程中聲明函數。 – Shadow

回答

0

CREATE FUNCTION決定我的問題。

很可惜的是,外部

CREATE DEFINER=`root`@`localhost` FUNCTION `prepare_ScaleCondition`(_Scale VARCHAR(16), _Date DATE) RETURNS varchar(64) CHARSET utf8 
BEGIN 
    DECLARE _ScaleCondition VARCHAR(128) DEFAULT EXTRACT(YEAR FROM _Date); 

    CASE _Scale 
     WHEN 'quarter' THEN SET _ScaleCondition = CONCAT(EXTRACT(YEAR FROM _Date), ' Q', EXTRACT(QUARTER FROM _Date)); 
     WHEN 'year' THEN SET _ScaleCondition = EXTRACT(YEAR FROM _Date); 
     WHEN 'month' THEN SET _ScaleCondition = CONCAT(EXTRACT(YEAR FROM _Date), ' M', EXTRACT(MONTH FROM _Date)); 
     WHEN 'week' THEN SET _ScaleCondition = CONCAT(EXTRACT(YEAR FROM _Date), ' W', EXTRACT(WEEK FROM _Date)); 
    END CASE; 

    RETURN _ScaleCondition; 
END 

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_PublicationsByDate`(IN _DateS DATE, IN _DateF DATE) 
BEGIN 

    SELECT 
     prepare_ScaleCondition(filed_date) AS date, 
     count(prepare_ScaleCondition(filed_date)) AS count 
    FROM 
     applications 
    WHERE 
     filed_date between _DateS and _DateF 
    GROUP BY 
     prepare_ScaleCondition(filed_date) 
    ORDER BY 
     prepare_ScaleCondition(filed_date); 

END