为什么用户定义变量不能正常工作

时间:2017-07-30 01:59:37

标签: mysql

我试图在if语句中使用子查询。 如果我执行以下操作

SELECT `Currency`, IF((SELECT `id` FROM `upload_currency` WHERE `CurrencyText`=`Currency`) > 0,(SELECT `id` FROM `upload_currency` WHERE `CurrencyText`=`Currency`),1) FROM `upload_salesinvoice`

我得到了输出 1,1,3 USD 2,1,1 EUR 2,1,1,1这是正确的

但是,如果我尝试使我的查询更有效,那么它会给我所有的1代。

SELECT `Currency`, IF(@val:=(SELECT `id` FROM `upload_currency` WHERE `CurrencyText`=`Currency`) > 0,@val,1) FROM `upload_salesinvoice`

我会解释一下我有一个名为upload_currency的表,在这个表中我有这个布局

id 1,CurrencyText GBP

id 2,CurrencyText EUR

id 3,CurrencyText USD

所以我的subselect应该返回1表示GBP,或者1表示空字符串,2表示EUR,3表示USD,但第二个查询失败并且给我全部1个

所以看起来我的用户定义变量由于某种原因失败了。

2 个答案:

答案 0 :(得分:2)

您的查询无效的原因是您要将比较值分配给您的变量;对于MySQL,赋值将如

@val:=((SELECT `id` FROM `upload_currency` WHERE `CurrencyText`=`Currency`) > 0)

是1或0,而不是id。所以你必须添加括号并使用

IF( (@val:=(SELECT `id` FROM `upload_currency` WHERE `CurrencyText`=`Currency`)) 
    > 0, @val, 1)  

话虽如此:我认为你想以一种非常复杂的方式做的事实上只是一个left join

select u.currency, coalesce(c.id,1) 
from upload_salesinvoice u
left join upload_currency c 
on c.CurrencyText=u.Currency

它也会更快。

答案 1 :(得分:0)

根据mysql手册:https://dev.mysql.com/doc/refman/5.7/en/user-variables.html

  

作为一般规则,除了在SET语句中,你永远不应该   为用户变量赋值并读取其中的值   声明......

已编辑:

 SELECT `Currency`, @val := (
   SELECT `id` FROM `upload_currency` 
   WHERE `CurrencyText`=`Currency`
 ), 
 IF(@val > 0,@val,1) FROM `upload_salesinvoice`;