错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中

Shr*_*wat 1 sql postgresql

我有一个表漏洞,我想从中查询按严重性(列)排序的记录.严重性列保持值"高","中","低".

下面给出的查询给出了错误:

对于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
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 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;
Run Code Online (Sandbox Code Playgroud)

或者将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;
Run Code Online (Sandbox Code Playgroud)

但机会是,你根本不想要DISTINCT *.就像@a_horse评论的那样,这只对完全重复有意义,这是一种罕见的情况,只有在你没有定义任何唯一的列(如PK!)时才有可能.

DISTINCT可能是多余的噪音.或者您的示例可能是更复杂查询的简化,或者您真的只想GROUP BY/ DISTINCT ON几个选定的列.对于后者,这是一个更有用的相关答案:

基础知识DISTINCT ON: