Sql 查询时如何在一种情况下嵌套多个MAX(…)语句

Sql 查询时如何在一种情况下嵌套多个MAX(…)语句,sql,postgresql,Sql,Postgresql,我正在使用PostgreSQL,目前我有如下内容: SELECT MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('9') THEN 1 ELSE 0 END) AS has9, MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('8') THEN 1 ELSE 0 END) AS has8 FROM xxxx CASE WHEN (MAX(CASE WHEN SUBSTRING(ar

我正在使用PostgreSQL,目前我有如下内容:

SELECT MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('9') THEN 1 ELSE 0 END) AS has9,
       MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('8') THEN 1 ELSE 0 END) AS has8
FROM xxxx
CASE WHEN 
    (MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('9') = 1 THEN 'has9' ELSE
    MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('8') = 1 THEN 'has8' ELSE 'FIX'
END as test_version
但我想要的是这样的:

SELECT MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('9') THEN 1 ELSE 0 END) AS has9,
       MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('8') THEN 1 ELSE 0 END) AS has8
FROM xxxx
CASE WHEN 
    (MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('9') = 1 THEN 'has9' ELSE
    MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('8') = 1 THEN 'has8' ELSE 'FIX'
END as test_version

到目前为止还没有成功。这有可能吗

在第一个示例中,使用MAX函数将单个article_code列转换为两个不同的列(has9和has8)。在第二个示例中,您不再将article_code列拆分为多个列,因此,据我所知,您不再需要MAX函数

你有没有试过以下几点

SELECT CASE WHEN SUBSTRING(article_code,5,1) IN ('9') THEN 'has9'
            ELSE SUBSTRING(article_code,5,1) IN ('8') THEN 'has8'
            ELSE 'FIX'
       END as test_version
FROM xxxx
编辑:啊,在这种情况下,您仍然需要MAX函数将其缩减为一行

您应该能够将原始查询用作获取单行的子查询,然后在将其转换为单个字符串时使用大小写:

SELECT CASE WHEN has9 = 1 THEN 'has9'
            WHEN has8 = 1 THEN 'has8'
            ELSE 'FIX'
       END as test_version
FROM (  SELECT MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('9') THEN 1 ELSE 0 END) AS has9,
               MAX(CASE WHEN SUBSTRING(article_code,5,1) IN ('8') THEN 1 ELSE 0 END) AS has8
        FROM xxxx )
或者,您可以使用我之前的查询作为子查询,并使用MAX函数将其缩减为一行:

SELECT CASE WHEN MAX(result_rank) = 3 THEN 'has9'
            WHEN MAX(result_rank) = 2 THEN 'has8'
            ELSE 'FIX'
       END as test_version
FROM ( SELECT CASE WHEN SUBSTRING(article_code,5,1) IN ('9') THEN 3
                   ELSE SUBSTRING(article_code,5,1) IN ('8') THEN 2
                   ELSE 1
              END as result_rank
       FROM xxxx )
我认为应该是:

SELECT 
      CASE 
           WHEN EXISTS(SELECT article_code 
                         FROM XXXX 
                        WHERE SUBSTRING(article_code,5,1) = '9')
           THEN 'has9'
           WHEN EXISTS(SELECT article_code 
                         FROM XXXX 
                        WHERE SUBSTRING(article_code,5,1) = '8')
           THEN 'has8'
           ELSE 'FIX'
END CASE  as test_version;

谢谢,但我还没完全明白。当我在没有MAX的情况下执行此操作时,查询将返回多行(Entry查询希望检查用户是否有特定产品),但我希望的是一行。如果我将这个CASE语句嵌套在MAX(…)表达式中,会发生什么呢?谢谢Sam,这正是我想要的。它返回所需的结果。然而,为什么输出与我写时的不同:
MAX(CASE when SUBSTRING(article_code,5,1)IN('9')然后'has9'否则CASE when SUBSTRING(article_code,5,1)IN('8')然后'has8'否则'FIX'END)作为测试版本
。。。我现在不明白这一点。@user3387124如果
对表中的任何一行有效,则
MAX(CASE WHEN THEN 1 ELSE 0 END)
构造返回1,否则返回0。在开始比较这些值之前,首先需要让MAX函数“计算”这些值。我认为在子查询中这样做最容易阅读/理解。顺便说一句:valex的答案也值得一试。