MySQL:是否可以在 SELECT 之外设置一个变量,而 SELECT 是唯一的权限?
MySQL: Is it possible to set a variable outside of SELECT with SELECT as the only permission?
什么
我在 MySQL 5.6
上,我的帐户只有 SELECT
和 USAGE
的权限(使用 SHOW GRANTS
命令找到)。
大概是因为在 SELECT
returns 之前使用 DECLARE
一个通用的语法错误。
为什么
我想使用变量来使代码更易于阅读和维护。
下面你可以看到 WHERE
子句中需要变量 @isOwn
并且天数差异可以缩短(注意:DATEDIFF
由于某种原因在 WHERE
中对我不起作用)
问题
能够在 SELECT
之前声明变量将简化一切。
我是不是做错了什么或者我不能因为我的最小权限而这样做?
代码示例
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`
使用 SET
关键字代替 DECLARE
。后者只在存储过程和函数中需要,定义局部变量.
你需要一个用户变量,这是不同的,例如它不需要定义它并且它没有严格的类型。用户变量有 @
前缀,局部变量没有。但是您仍然可以访问它,即使是从存储的 procedures/functions.
此外,如评论所述,您需要使用定界符 ;
分隔两个语句(SET
和 SELECT
)(或者可能将它们称为同一连接上的两个语句).
什么
我在 MySQL 5.6
上,我的帐户只有 SELECT
和 USAGE
的权限(使用 SHOW GRANTS
命令找到)。
大概是因为在 SELECT
returns 之前使用 DECLARE
一个通用的语法错误。
为什么
我想使用变量来使代码更易于阅读和维护。
下面你可以看到 WHERE
子句中需要变量 @isOwn
并且天数差异可以缩短(注意:DATEDIFF
由于某种原因在 WHERE
中对我不起作用)
问题
能够在 SELECT
之前声明变量将简化一切。
我是不是做错了什么或者我不能因为我的最小权限而这样做?
代码示例
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`
使用 SET
关键字代替 DECLARE
。后者只在存储过程和函数中需要,定义局部变量.
你需要一个用户变量,这是不同的,例如它不需要定义它并且它没有严格的类型。用户变量有 @
前缀,局部变量没有。但是您仍然可以访问它,即使是从存储的 procedures/functions.
此外,如评论所述,您需要使用定界符 ;
分隔两个语句(SET
和 SELECT
)(或者可能将它们称为同一连接上的两个语句).