WHAT
I’m on MySQL 5.6
and my account only has permissions for SELECT
and USAGE
(as found using the SHOW GRANTS
command).
Presumably because of this using DECLARE
before SELECT
returns a generic syntax error.
WHY
I want to use variables to both make the code easier to read and maintain.
Below you can see variable @isOwn
is needed in WHERE
clause and the day differences could be shortened (note: DATEDIFF
didn’t work for me in WHERE
for some reason)
QUESTION
Being able to declare the variables before SELECT
would simplify everything.
Am I doing something wrong or can I not do this because of my minimal permissions?
CODE EXAMPLE
DECLARE @test INT = 5 -- <<< syntax error
SELECT
CASE
WHEN @isOwn := sp.`name` LIKE 'TST %'
THEN 'O' ELSE 'S'
END AS 'Group',
st.`name` AS 'Type',
COUNT(st.`name`) AS 'Count',
DATE(MIN(os.endTime)) AS 'From',
CASE
WHEN @isOwn
THEN TO_DAYS(CURRENT_DATE) - TO_DAYS(MIN(os.endTime)) - 3 + 1
ELSE TO_DAYS(CURRENT_DATE) - TO_DAYS(MIN(os.endTime)) - 28 + 1
END AS 'DO'
FROM tdb.orders AS os
LEFT OUTER JOIN tdb.shipment_type AS st
ON (st.ID = os.shipmentType_ID)
LEFT OUTER JOIN tdb.suppliers AS sp
ON (sp.ID = os.supplier_ID)
WHERE
os.proof IS NULL
AND os.endTime IS NOT NULL
AND ((
sp.`name` NOT LIKE 'TST %' AND
(TO_DAYS(CURRENT_DATE) - TO_DAYS(os.endTime)) >= 3
) OR (
sp.`name` NOT LIKE 'TST %' AND
(TO_DAYS(CURRENT_DATE) - TO_DAYS(os.endTime)) >= 28
))
AND YEAR(os.endTime) = YEAR(CURRENT_DATE)
GROUP BY
CASE
WHEN sp.`name` LIKE 'TST %'
THEN 'O' ELSE 'S'
END,
st.`name`
Advertisement
Answer
Use SET
keyword instead of DECLARE
. The latter is only needed in stored procedures and functions, to define local variables.
You need an user variable, which is different, for example it is not required to define it and it has no strict type. User variables have @
prefix, local variables don’t. But you can still access it, even from stored procedures/functions.
Also, as commented, you need to separate the two statements (SET
and SELECT
) with a delimiter ;
(or perhaps call them as two statements on the same connection).