尝试在 PostgreSQL 查询的 ORDER BY 子句中使用别名时,某些用户遇到错误“column不存在。”
考虑以下示例:
SELECT title, (stock_one + stock_two) AS global_stock FROM product ORDER BY global_stock = 0, title;
在 PostgreSQL 8.1.23 中运行此查询会产生错误:“列 'global_stock' 不存在。”出现此错误的原因是 ORDER BY 子句中无法识别别名。
有两种可能的解决方案:
1.数字排序:
您可以通过列在 SELECT 子句中的位置来引用列,而不是使用别名。在上面的示例中,“global_stock”别名对应于第 2 列。因此,修改后的查询将为:
SELECT title, (stock_one + stock_two) AS global_stock FROM product ORDER BY 2, 1;
2。使用 CASE 表达式的子查询:
另一个选项是使用子查询和 CASE 表达式:
SELECT * FROM ( SELECT title, (stock_one + stock_two) AS global_stock FROM product ) x ORDER BY (CASE WHEN global_stock = 0 THEN 1 ELSE 0 END) DESC, title;
在这种情况下,CASE 表达式将值 1 分配给具有'global_stock' = 0,所有其他均为 0。然后,查询根据该值对结果进行降序排序,有效地对可用项目进行优先级排序。
以上是如何在 PostgreSQL ORDER BY 子句中使用别名而不出现'列不存在”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!