我有一个表漏洞,我想从中查询按严重性(列)排序的记录。 严重性列保持值"高","中","低"。
以下给出的查询给出了错误:
对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表"
中
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
答案 0 :(得分:5)
使用子查询:
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 commented一样,这仅适用于完全重复,这是一种罕见的情况,只有在您没有定义任何唯一列(如PK!)时才有可能。
DISTINCT
可能是多余的噪音。或者您的示例可能是对更复杂查询的简化,或者您真的只想GROUP BY
/ DISTINCT ON
一些选定的列。对于后者,这是一个更有用的相关答案:
DISTINCT ON
的基础知识: