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



我有一个表漏洞,我想从其中查询记录的严重性排序(列)。严重性列的值为"高"、"中"、"低"。

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

对于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组的第一行?

最新更新