Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在以后的查询中用作值_Mysql_Sql - Fatal编程技术网

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()

谢谢你的报价!我知道我可以复制粘贴整个逻辑,但我试图避免…谢谢你的报价!我知道我可以复制粘贴整个逻辑,但我正试图避免。。