MySQL:是否可以在 SELECT 之外设置一个变量,而 SELECT 是唯一的权限?

MySQL: Is it possible to set a variable outside of SELECT with SELECT as the only permission?

什么
我在 MySQL 5.6 上,我的帐户只有 SELECTUSAGE 的权限(使用 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.

此外,如评论所述,您需要使用定界符 ; 分隔两个语句(SETSELECT)(或者可能将它们称为同一连接上的两个语句).