2011-10-25 41 views
4

我有这样的select语句做工精细:在SELECT语句中使用用户定义的变量的where子句

SELECT 
    pre, dict.char, post, score 
    , (SELECT @res := MatchPre(pre, 'test') AS var) AS mpre 
FROM dict; 

它返回所有的数据正确,从MatchPre结果在标有“MPRE”列。然而,我只想得到结果,其中mpre> 0.因此,在逻辑上,我试过这个:

SELECT 
    pre, dict.char, post, score 
    , (SELECT @res := MatchPre(pre, 'test') AS var) AS mpre 
FROM dict 
WHERE mpre > 0; 

但无济于事。我试过用“WHERE @res> 0”,“WHERE @ res.mpre> 0”,“WHERE mpre。@ res> 0”等交换“WHERE mpre> 0”,但是它会抛出错误或返回一个空的结果集,尽管原始的无查询给出了mpre值大于0的行。

这是什么正确的语法?

回答

6
SELECT 
    pre, dict.char, post, score 
    , (SELECT @res := MatchPre(pre, 'test') AS var) AS mpre 
FROM dict 
HAVING mpre > 0; 

您不能在where子句中使用别名。
您将不得不使用having子句,或将带有别名的选择放入另一个外部选择内。

这是因为当where子句运行时,别名尚未评估。
having运行所有selectwheregroup byfromjoins是成品,不会受此限制。
虽然不能使用索引。
如果你想使用索引使用子选择。

SELECT sub.* FROM 
    (SELECT 
    pre, dict.char, post, score 
    , (SELECT @res := MatchPre(pre, 'test') AS var) AS mpre 
    FROM dict) sub 
WHERE sub.mpre > 0 
+0

不错,完美的作品。谢谢! – user173342

相关问题