Author: admin

  • MySQL – stored function example

    [adsense id=”0514458240″ width=”468″ height=”60″]

    Today I responded to someone that had a problem with sorting their data. Unfortunately their data model was the problem more than the data. However, I thought I would share with you the problem and the resulting code that I generated for them.

    The issue is that an apparel system included a field that contained both the apparel model name and a particular style. For instance, jeans01white. The format of the data always included the model name, a number and finally the style. However, the model name may include numbers. As a result, the person was looking for a way of getting only the model from this.

    The algorithm is simple, start at the end and continue scanning each character until a number is found. Then take the substring from the first character until and including this first numeric. This is not possible (or complex) in a single query. As a result a stored function can help with this processing:

    --
    -- Ronan Cashell (c) IT Integrated Business Solutions 2011
    -- 01 March 2011
    -- https://it-iss.com
    --
    DROP FUNCTION IF EXISTS getProduct;
    
    DELIMITER $$
    CREATE FUNCTION getProduct(aProduct VARCHAR(30))
    RETURNS VARCHAR(30)
    NO SQL
    BEGIN
    	DECLARE count INT;
    	DECLARE i INT;
    	DECLARE prod VARCHAR(30);
    	SET prod = aProduct;
    	SET count = LENGTH(aProduct);
    	SET i = 0;
    	WHILE i < count AND (SUBSTRING(prod, count-i, 1) < '0' OR SUBSTRING(prod, count-i, 1) > '9') DO
    		SET i = i + 1;
    	END WHILE;
    	RETURN LEFT(prod, count-i);
    END;
    $$
    
    DELIMITER ;
    
    

    In action a table contains the following product numbers and the resulting output using this function:

    mysql> select getProduct(product) as model, product from c;+-----------------------+--------------------------+
    | model                 | product                  |
    +-----------------------+--------------------------+
    | A01                   | A01black                 | 
    | A01                   | A01white                 | 
    | A02                   | A02yellow                | 
    | A03                   | A03blue                  | 
    | A03                   | A03grey                  | 
    | A09                   | A09green                 | 
    | clothing-dress-y-5255 | clothing-dress-y-5255red | 
    +-----------------------+--------------------------+
    7 rows in set (0.01 sec)