MySQL:在SELECT语句中使用变量

时间:2014-11-28 20:08:14

标签: mysql sql database variables select

请查看以下声明

INSERT INTO Ongoing_Fees (currentDate, Gross_Fee, Insurance_Fee, Submit_Fee)
    SELECT current_timestamp, New.Gross_Fee,
           @InsuranceFee := (New.Gross_Fee)*(p.E_Fee/100),
           @SubmitFee := @InsuranceFee-(p.s_Fee/100)
    FROM Portfolio p
    WHERE p.idPortfolio = New.idPortfolio;

这里我使用2个用户定义变量@InsuranceFee@SubmitFee。如您所见,您可以通过从@SubmitFee中扣除值来获得@InsuranceFee

现在,为了使其正常工作,必须首先评估@InsuranceFee“。但是MySQL document下面会说

  

作为一般规则,除了在SET语句中,你永远不应该   为用户变量赋值并读取其中的值   声明。例如,要增加变量,这没关系:

     

SET @a = @a + 1;对于其他语句,例如SELECT,您可能会得到   你期望的结果,但这不能保证。在下面的   声明,您可能会认为MySQL会首先评估@a   做第二个任务:

     

SELECT @ a,@ a:= @ a + 1,...;但是,评估顺序为   涉及用户变量的表达式是未定义的。

那么,我可以在SELECT内使用变量的最佳方式是什么?

更新

可能首先使用单独的SELECT语句将值分配到变量中更好吗?像下面的东西......

 SET   @InsuranceFee :=    New.Gross_Fee * ((SELECT E_Fee FROM Portfolio WHERE idPortfolio = New.idPortfolio)/100);

 SET   @SubmitFee := @InsuranceFee - ((SELECT s_FeeFROM Portfolio WHERE idPortfolio = New.idPortfolio)/100)

    INSERT INTO Ongoing_Fees (currentDate, Gross_Fee, Insurance_Fee, Submit_Fee)
           current_timestamp, New.Gross_Fee,
                   @InsuranceFee ,
                   @SubmitFee

1 个答案:

答案 0 :(得分:0)

User-defined variables不应该像这样使用。正如我的评论所述,没有理由不把它全部写出来。但是,如果您只是喜欢临时语法,则可以始终使用子查询:

INSERT INTO Ongoing_Fees (currentDate, Gross_Fee, Insurance_Fee, Submit_Fee)
SELECT ct, gross_fee, InsuranceFee, InsuranceFee-SubmitFee
FROM (
    SELECT current_timestamp ct, 
       New.Gross_Fee,
       New.Gross_Fee*p.E_Fee/100 as InsuranceFee,
       p.s_Fee/100 as SubmitFee
    FROM Portfolio p
    WHERE p.idPortfolio = New.idPortfolio
) T