Mysql在WHERE条件下使用SELECT中的解析列

时间:2014-08-12 15:23:11

标签: mysql

我该怎么做:

SELECT DID, DNumbers, CONCAT(SUBSTRING_INDEX(DNumbers, " - ", 1), ", ") AS DNumbers_Parsed
FROM Test
WHERE DNumbers_Parsed LIKE '%, 1,%' AND DNumbers_Parsed LIKE '%, 5,%'

这会出现错误,指出未找到列DNumbers_Parsed。我知道我可以对每个条件使用相同的解析事物但是可以只执行一次然后在条件中使用它吗?

2 个答案:

答案 0 :(得分:1)

一般来说,您不能在where子句中使用派生字段,因为在应用where过滤器时,派生字段的值可能尚不可用(例如聚合功能结果)。

尝试使用HAVING代替:

SELECT ...
FROM ...
HAVING DNumbers_Parsed LIKE ...
在完成所有聚合操作/字段值派生之后,在结果发送到客户端之前应用

HAVING

并注意上面的代码有一个拼写错误:AN DNumbers_....

答案 1 :(得分:0)

好吧,Marc B发布的having子句是一个很好的解决方案..即使通常很慢......你可以尝试的另一种方式是在子查询中,这样数据就已经从服务器返回了。 / p>

SELECT * 
FROM(
    SELECT DID, DNumbers, CONCAT(SUBSTRING_INDEX(DNumbers, " - ", 1), ", ") AS DNumbers_Parsed
    FROM Test
)t
WHERE t.DNumbers_Parsed LIKE '%, 1,%' AN t.DNumbers_Parsed LIKE '%, 5,%'