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

时间:2014-07-18 05:31:33

标签: 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

1 个答案:

答案 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的基础知识: