我试图在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个
所以看起来我的用户定义变量由于某种原因失败了。
答案 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`;