MySQL:IS NOT NULL检查自定义生成的列(别名)

时间:2015-07-24 06:25:06

标签: mysql stored-procedures where alias notnull

存储过程到目前为止工作正常,但我希望仅在 dist_calculated IS NOT NULL时记录。当我在where clause中使用该条件时,会显示错误#1054 - Unknown column 'dist_calculated' in 'where clause'。 Witout where子句运行良好并返回NULL记录,如:

entity_id   dist_calculated     
49              NULL
50              NULL
52              4460.615
51              4875.179

我想排除NULL。

我尝试了WHERE dist_calculated IS NOT NULLWHERE cpe.dist_calculated IS NOT NULL仍然出错。

我的存储过程是:

DELIMITER //
CREATE PROCEDURE get_close_childcares(IN latUser DECIMAL(15,6),IN lngUser DECIMAL(15,6) )
BEGIN
    /*Get 4 ids of closest childcares*/
    /*Outer query   
    @param : userLat, userLng, Current childcare lat,current childcare lng
    Note : Inner query returns lat , lng of Current product 176 : lat , 177: lng
    */
    SELECT cpe.entity_id , get_distance_in_miles_between_geo_locations(latUser,lngUser,
        (SELECT cpev.value FROM catalog_product_entity_varchar AS cpev 
            WHERE (cpev.entity_id = cpe.entity_id AND cpev.attribute_id = 176)
        ),
        (SELECT cpev.value FROM catalog_product_entity_varchar AS cpev 
            WHERE (cpev.entity_id = cpe.entity_id AND cpev.attribute_id = 177)
        )
    ) AS dist_calculated
    FROM catalog_product_entity AS cpe
    WHERE dist_calculated IS NOT NULL
    ORDER BY dist_calculated ASC
    LIMIT 0,4;

END
//
DELIMITER ;

并调用存储过程:

call get_close_childcares(19.992100,73.777000)

感谢。

3 个答案:

答案 0 :(得分:3)

MySQL确实允许在GROUP BY和HAVING上使用列别名,但不允许在WHERE语句中使用。因此,您需要在WHERE中使用完整定义,例如

SELECT cpe.entity_id , get_distance_in_miles_between_geo_locations(latUser,lngUser,
    (SELECT cpev.value FROM catalog_product_entity_varchar AS cpev 
        WHERE (cpev.entity_id = cpe.entity_id AND cpev.attribute_id = 176)
    ),
    (SELECT cpev.value FROM catalog_product_entity_varchar AS cpev 
        WHERE (cpev.entity_id = cpe.entity_id AND cpev.attribute_id = 177)
    )
) AS dist_calculated
FROM catalog_product_entity AS cpe
WHERE
get_distance_in_miles_between_geo_locations(latUser,lngUser,
        (SELECT cpev.value FROM catalog_product_entity_varchar AS cpev 
            WHERE (cpev.entity_id = cpe.entity_id AND cpev.attribute_id = 176)
        ),
        (SELECT cpev.value FROM catalog_product_entity_varchar AS cpev 
            WHERE (cpev.entity_id = cpe.entity_id AND cpev.attribute_id = 177)
        )
    ) IS NOT NULL
ORDER BY dist_calculated ASC
LIMIT 0,4;

答案 1 :(得分:3)

你可以尝试这个伴侣:

SELECT
    cpe.entity_id,
    get_distance_in_miles_between_geo_locations (
        latUser,
        lngUser,
        cpev_1.`value`,
        cpev_2.`value`
    ) AS dist_calculated
FROM
    catalog_product_entity cpe
    INNER JOIN catalog_product_entity_varchar cpev_1 ON cpev_1.entity_id = cpe.entity_id
        AND cpev_1.attribute_id = 176
    INNER JOIN catalog_product_entity_varchar cpev_2 ON cpev_2.entity_id = cpev.entity_id
        AND cpev_2.attribute_id = 177
ORDER BY
    dist_calculated ASC
LIMIT 0,4;  

答案 2 :(得分:0)

请尝试

CREATE PROCEDURE get_close_childcares(IN latUser DECIMAL(15,6),IN lngUser DECIMAL(15,6) )
BEGIN
    /*Get 4 ids of closest childcares*/
    /*Outer query   
    @param : userLat, userLng, Current childcare lat,current childcare lng
    Note : Inner query returns lat , lng of Current product 176 : lat , 177: lng
    */
    SELECT cpe.entity_id , get_distance_in_miles_between_geo_locations(latUser,lngUser,
        (SELECT cpev.value FROM catalog_product_entity_varchar AS cpev 
            WHERE (cpev.entity_id = cpe.entity_id AND cpev.attribute_id = 176)
        ),
        (SELECT cpev.value FROM catalog_product_entity_varchar AS cpev 
            WHERE (cpev.entity_id = cpe.entity_id AND cpev.attribute_id = 177)
        )
    ) AS dist_calculated
    FROM catalog_product_entity AS cpe
    WHERE get_distance_in_miles_between_geo_locations(latUser,lngUser,
        (SELECT cpev.value FROM catalog_product_entity_varchar AS cpev 
            WHERE (cpev.entity_id = cpe.entity_id AND cpev.attribute_id = 176)
        ),
        (SELECT cpev.value FROM catalog_product_entity_varchar AS cpev 
            WHERE (cpev.entity_id = cpe.entity_id AND cpev.attribute_id = 177)
        )
    ) IS NOT NULL
    ORDER BY dist_calculated ASC
    LIMIT 0,4;

END