有人可以帮助我了解这里发生了什么吗?
SELECT
jsonb_array_length(to_jsonb("gi"."colors_distilled")) "gi_colors_distilled_jsonb_len"
FROM
"general_inventories" "gi"
WHERE
"gi_colors_distilled_jsonb_len" > 1;
失败:
-- ERROR: column "gi_colors_distilled_jsonb_len" does not exist
-- LINE 6: "gi_colors_distilled_jsonb_len" > 1;
然而,这是可行的(直接在条件内实现表达式):
SELECT
jsonb_array_length(to_jsonb("gi"."colors_distilled")) "gi_colors_distilled_jsonb_len"
FROM
"general_inventories" "gi"
WHERE
jsonb_array_length(to_jsonb("gi"."colors_distilled")) > 1;
感觉我一定错过了一些明显的东西,但那里的东西太少了,我一定是搞砸了关于如何/何时评估别名的假设。
其原因在于
TRUE
SQL 语句中的操作顺序。这有点违反直觉,但一旦你领悟了整个时代精神,它就会水到渠成,你就会明白为什么某些结构不起作用,尽管新手可能认为它们应该起作用!操作顺序:
从这里(很好的解释)开始,它是:
FROM/JOIN
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT/OFFSET
因此,我们看到 出现
WHERE
在之前,SELECT
但它位于SELECT
定义别名的位置,但该WHERE
子句无法“看到”别名,因为它已经被求值了。ORDER BY
另一方面,该子句位于the之后SELECT
,因此您可以在该子句中使用别名!您自己的问题已在链接中得到解答。
看看这里的另一个例子 - 解释 MySQL 有时如何忽略这些以及它可能导致的问题(
STRICT_MODE
关闭 - 永远不要以这种方式运行 MySQL)。作者(Lukas Eder)始终值得关注(例如 YouTube)。