Mysql 在以后的查询中用作值
考虑以下示例查询:Mysql 在以后的查询中用作值,mysql,sql,Mysql,Sql,考虑以下示例查询: SELECT foo.bar, DATEDIFF( # Some more advanced logic, such as IF(,,), which shouldn't be copy pasted ) as bazValue FROM foo WHERE bazValue >= CURDATE() # <-- This doesn't work 如何在查询的后面使该值可用?我更喜欢这样,因为我相信如果可能的话,在一个地方维护代码就足够了。如以下所述:
SELECT foo.bar,
DATEDIFF(
# Some more advanced logic, such as IF(,,), which shouldn't be copy pasted
) as bazValue
FROM foo
WHERE bazValue >= CURDATE() # <-- This doesn't work
如何在查询的后面使该值可用?我更喜欢这样,因为我相信如果可能的话,在一个地方维护代码就足够了。如以下所述:
标准SQL不允许在WHERE子句中引用列别名。施加此限制是因为在计算WHERE子句时,可能尚未确定列值。例如,以下查询是非法的:
从tbl_名称中选择id,将*计为cnt
其中cnt>0组(按id);
WHERE子句确定哪些行应包含在GROUP BY子句中,但它指的是列值的别名,该列值在选定行并按GROUP BY分组后才为人所知
但是,您可以重用别名表达式,如果它使用确定性函数,查询优化程序将确保重用缓存的结果:
选择foo.bar,
DATEDIFF
-你的论点
作为价值
来自富
DATEDIFF在哪里
-你的论点
>=CURDATE
或者,您可以将筛选器移动到HAVING子句中,在HAVING子句中,别名列将已计算,因此可用,但性能将受到影响,因为无法使用索引,并且在编译结果之前不会应用筛选器。如下所述:
标准SQL不允许在WHERE子句中引用列别名。施加此限制是因为在计算WHERE子句时,可能尚未确定列值。例如,以下查询是非法的:
从tbl_名称中选择id,将*计为cnt
其中cnt>0组(按id);
WHERE子句确定哪些行应包含在GROUP BY子句中,但它指的是列值的别名,该列值在选定行并按GROUP BY分组后才为人所知
但是,您可以重用别名表达式,如果它使用确定性函数,查询优化程序将确保重用缓存的结果:
选择foo.bar,
DATEDIFF
-你的论点
作为价值
来自富
DATEDIFF在哪里
-你的论点
>=CURDATE
P>可选的,您可以将筛选器移动到AdHEAR子句中,其中别名列已经被计算,因此可用,但性能将受到影响,因为索引不能被使用,并且在编译结果后将不应用该过滤器。
由于MySQL不支持CTE,请考虑使用内联视图:
您可以在MySQL中使用以下几种方法来解决此问题: 通过使用内联视图,这也适用于大多数其他版本的SQL:
select * from
(SELECT foo.bar,
DATEDIFF(
# Some more advanced logic, such as IF(,,), which shouldn't be copy pasted
) as bazValue
FROM foo) buz
WHERE bazValue >= CURDATE()
HAVING子句中使用列别名的HAVING子句是MySQL特有的:
SELECT foo.bar,
DATEDIFF(
# Some more advanced logic, such as IF(,,), which shouldn't be copy pasted
) as bazValue
FROM foo
HAVING bazValue >= CURDATE()
您可以在MySQL中使用以下几种方法来解决此问题: 通过使用内联视图,这也适用于大多数其他版本的SQL:
select * from
(SELECT foo.bar,
DATEDIFF(
# Some more advanced logic, such as IF(,,), which shouldn't be copy pasted
) as bazValue
FROM foo) buz
WHERE bazValue >= CURDATE()
HAVING子句中使用列别名的HAVING子句是MySQL特有的:
SELECT foo.bar,
DATEDIFF(
# Some more advanced logic, such as IF(,,), which shouldn't be copy pasted
) as bazValue
FROM foo
HAVING bazValue >= CURDATE()
谢谢你的报价!我知道我可以复制粘贴整个逻辑,但我试图避免…谢谢你的报价!我知道我可以复制粘贴整个逻辑,但我正试图避免。。