我的代码中有以下几行
query = "SELECT id, "
"( 3959 * acos( cos( radians(37) ) * cos( radians( %(lat)i ) ) * "
"cos( radians( %(lng)i ) - radians(-122) ) + sin( radians(37) ) * "
"sin( radians( %(lat)i ) ) ) ) AS `distance` from message where"
" `distance` <= %(drange)d" % {'lat': float(lat), 'lng': float(lng), 'drange': int(drange)}
print query
messages = db.session.query(Message).from_statement(query).all()
当我使用这个时,我得到了以下错误
OperationalError: (OperationalError) (1054, "Unknown column 'distance' in 'where clause'") 'SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( 0 ) ) * cos( radians( 0 ) - radians(-122) ) + sin( radians(37) ) * sin( radians( 0 ) ) ) ) AS `distance` from message where `distance` <= 50' ()
解决此问题的正确方法是什么?
您不能在WHERE
子句中引用命名表达式(distance
)(我不知道这是否适用于所有数据库系统,但至少适用于MySQL)。您可以改用HAVING
(请参见选项C)。
选项:
A。在where子句中再次重复该表达式:
SELECT id, (long_formula) as distance FROM message WHERE (long_formula) <= ...
B。使用嵌套查询:
SELECT * FROM
(SELECT id, (long_formula) AS distance FROM message) inner_query
WHERE distance <= ...
C。使用HAVING
子句(我已经使用SQL很多年了,但直到读到这篇文章才知道HAVING
):
SELECT id, (long_formula) as distance FROM message HAVING distance <= ...
与您的问题无关,但如果开始使用",您可以提高查询的可读性例如,您的查询可以通过以下方式进行修改:
query = """
SELECT id,
( 3959 * acos( cos( radians(37) ) * cos( radians( %(lat)i ) ) * cos( radians( %(lng)i ) - radians(-122) ) +
sin( radians(37) ) * sin( radians( %(lat)i ) ) ) ) AS distance
FROM message
WHERE distance <= %(drange)d
""" % {'lat': float(lat), 'lng': float(lng), 'drange': int(drange)}
同样对我来说,使用"AS‘distance’"而不是"AS distance"作为别名正确吗?我的意思是允许使用"吗?