我有一个表漏洞,我想从其中查询记录的严重性排序(列)。严重性列的值为"高"、"中"、"低"。
下面给出的查询给了我错误:
对于SELECT DISTINCT, ORDER BY表达式必须出现在SELECT list
SELECT DISTINCT vuln
FROM Vulnerabilities vuln
WHERE (lower(vuln.dsc) LIKE '%tomcat%')
ORDER BY CASE vuln.severity
WHEN 'High' THEN 1
WHEN 'Medium' THEN 2
WHEN 'Low' THEN 3
END ASC
使用子查询:
SELECT *
FROM (
SELECT DISTINCT *
FROM Vulnerabilities vuln
WHERE lower(dsc) LIKE '%tomcat%'
) sub
ORDER BY CASE severity
WHEN 'High' THEN 1
WHEN 'Medium' THEN 2
WHEN 'Low' THEN 3
END;
或者使ORDER BY
表达成为SELECT
列表的一部分:
SELECT DISTINCT
CASE severity
WHEN 'High' THEN 1
WHEN 'Medium' THEN 2
WHEN 'Low' THEN 3
END AS severity_order, *
FROM Vulnerabilities vuln
WHERE lower(dsc) LIKE '%tomcat%'
ORDER BY 1;
但机会是,你根本不想要DISTINCT *
。就像@a_horse评论的那样,这只对完全重复有意义,这是一种罕见的情况,只有在您没有定义任何唯一列(如PK!)时才有可能
DISTINCT
可能是冗余噪声。或者您的示例可能是一个更复杂的查询的简化,或者您确实希望GROUP BY
/DISTINCT ON
只选择几个列。对于后者,这里有一个更有用的相关答案:
- 如何在PostgreSQL查询中排序不同的元组
DISTINCT ON
基础:
- 选择每个GROUP BY组的第一行?