如何在 Redshift ORDER BY 子句中首先按特定值排序?
Posted
技术标签:
【中文标题】如何在 Redshift ORDER BY 子句中首先按特定值排序?【英文标题】:How to order by specific value first in Redshift ORDER BY clause? 【发布时间】:2020-12-27 05:02:41 【问题描述】:亚马逊红移 1.0.22169
我正在尝试按公司名称排序并首先放置任何“N/A”值。我有一个像这样的简单测试表:
+----+-----------+
| id | name |
+----+-----------+
| 1 | Company 3 |
| 2 | Company 1 |
| 3 | N/A |
| 4 | Company 2 |
+----+-----------+
对于 mysql,我使用以下内容:
SELECT
`name` AS 'company'
FROM
`companies`
GROUP BY
`company`
ORDER BY
CASE `company` WHEN 'N/A' THEN 1 ELSE 2 END ASC,
`company` ASC
得到想要的结果:
+-----------+
| company |
+-----------+
| N/A |
| Company 1 |
| Company 2 |
| Company 3 |
+-----------+
但在 Redshift 中尝试这样做时:
SELECT
"name" AS "company"
FROM
"companies"
GROUP BY
"company"
ORDER BY
CASE "company" WHEN 'N/A' THEN 1 ELSE 2 END ASC,
"company" ASC
我收到以下错误:
Query 1 ERROR: ERROR: column "company" does not exist in companies
有什么建议可以调整它以适用于 PostgreSQL 吗?
【问题讨论】:
错误出现在哪一行,如果您使用"name"
而不是那里的 "company"
别名,它会起作用吗?
是的,但如果可能的话,我必须让它与别名一起使用。这是问题的简化版本。真正的查询使用类似于COALESCE("companies"."name", "other_table"."name", "another_table"."name", 'N/A') AS "company"
。
@Noah 看来你的建议是让它工作的唯一方法。谢谢
【参考方案1】:
所有数据库都允许将列别名用作ORDER BY
中的键。有些不允许在别名上使用 表达式。
而且(令我惊讶)Postgres 就是其中的一个数据库。 Redshift 是基于旧版 Postgres 的代码库构建的,因此它可能遵循相同的规则。
所以使用基列名称:
ORDER BY (CASE name WHEN 'N/A' THEN 1 ELSE 2 END) ASC,
name ASC -- this could also be "company"
注意:如果列中从未有 NULL
值,则可以将其表示为:
ORDER BY NULLIF(name, 'N/A') NULLS FIRST
【讨论】:
我怀疑这是我最终不得不使用的方法,因为基列名称确实有效,但在我的情况下它只会让它变得更加困难。对于这样一个使用条件检查和各种表来创建它的复杂组,ORDER BY
需要所有这些相同的条件,这会变得混乱。感谢您指出NULLS FIRST
选项!有趣..以上是关于如何在 Redshift ORDER BY 子句中首先按特定值排序?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在具有GROUP BY子句的查询中选择非聚合列,而GROUP BY子句在功能上不依赖于GROUP BY子句中的列?