I’m a non-programmer and want to use the power of SQL to sort my inventory data. Here’s the sample table that I have.
x
Product | Option_1_Value
Apple | 1 gallon
Apple | Apple
Apple | 30ml
Apple | 4 gallons
Apple | 10ml
Apple | 100ml
Apple | 500ml
Apple | 1 liter
Banana| 4 gallons
Banana| 1 gallon
Banana| Banana
Banana| 10ml
Banana| 100ml
Banana| 500ml
Banana| 1 liter
I want to turn this data to this. How can I query my table to have a result like this below
Product | Option_1_Value
Apple | Apple
Apple | 10ml
Apple | 30ml
Apple | 100ml
Apple | 500ml
Apple | 1 liter
Apple | 1 gallon
Apple | 4 gallons
Banana| Banana
Banana| 10ml
Banana| 100ml
Banana| 500ml
Banana| 1 liter
Banana| 1 gallon
Banana| 4 gallons
Advertisement
Answer
These two suggestions – if stick to the datasets given.
If you’re on MySQL 8++ or MariaDB 10.3+, you can use REGEXP_REPLACE
like this:
SET @gal := 3.78541, @lit := 1000; -- setting variable value for gallon & liter.
SELECT Product,option_1_value,
(CASE WHEN size LIKE '%gallon%' THEN qty*@gal*@lit WHEN size LIKE '%liter%' THEN qty*@lit ELSE qty END)+0 AS size_in_ml
FROM
(SELECT *,
REGEXP_REPLACE(option_1_value,'[A-Za-z]','') AS Qty,
TRIM(REGEXP_REPLACE(option_1_value,'[0-9]','')) AS Size
FROM myproduct) p
ORDER BY product ASC, size_in_ml ASC;
If you’re using older MySQL version:
SET @gal := 3.78541, @lit := 1000; -- setting variable value for gallon & liter.
SELECT Product,option_1_value,
(CASE WHEN size LIKE '%gallon%' THEN qty*@gal*@lit WHEN size LIKE '%liter%' THEN qty*@lit ELSE qty END)+0 AS size_in_ml
FROM
(SELECT *,
REPLACE(REPLACE(REPLACE(REPLACE(option_1_value,'gallons',''),'gallon',''),'ml',''),'liter','')+0 AS Qty,
SUBSTRING(option_1_value,LEAST(IF(LOCATE('g',option_1_value)=0,99,LOCATE('g',option_1_value)),
IF(LOCATE('l',option_1_value)=0,99,LOCATE('l',option_1_value)),
IF(LOCATE('m',option_1_value)=0,99,LOCATE('m',option_1_value)))) AS size FROM myproduct) p
ORDER BY product ASC, size_in_ml ASC;