Informix 的 CASE 语句

CASE Statement With Informix

我想更新我 运行 针对 Informix table 的查询并需要一些帮助。 不幸的是,我没有意识到 SQL Server 和 Informix 之间的区别,并且得到了一个很好的响应 here 但它不起作用。

基本上我想做的是创建一个名为 Job_Account 的新列,如果我在 CASE 语句中返回 Y,或者如果我返回 N,则显示 cus_num 作为记录那会返回 Y。 这些记录将有不同的客户编号,但共享一个 cus_dun_no。 所以基本上,如果 Main 是 N,则显示主要客户编号(返回 Y 的记录)。

结果如下:

Main    Job Account cus_cus_no      cus_lkp_nm  cus_nm

Y                   6625            ABC, INC.   ABC, INC.
N       6625        6694            ABC (123)   ABC, INC.(123)

这是当前查询:

SELECT CASE 
    WHEN (
            cus_nm LIKE '%(%'
            AND cus_lkp_nm NOT LIKE '%REG%'
         )
        THEN 'N'
    ELSE 'Y'
    END AS Main
,*
FROM arrcus_rec
WHERE cus_dun_no IN (
    SELECT cus_dun_no
    FROM arrcus_rec
    WHERE cus_usg_sts = 'A'
    GROUP BY cus_dun_no
    HAVING COUNT(cus_dun_no) > 1
    )

示例数据示例:

您可以看到样本数据显示工作帐户(带括号),我已将主要帐户标记为 Y,将工作帐户标记为 N。

我不知道 Informix,但在标准 SQL 中存在语义问题:count() 在与 group by 相同的列上无法工作,Having count(cus_dun_no)>1 会可能总是假的。

会的,但是没有示例数据我是瞎子:

FROM arrcus_rec
WHERE cus_cus_no IN (
  SELECT cus_cus_no
  FROM arrcus_rec
  WHERE cus_usg_sts = 'A'
  GROUP BY cus_cus_no
  HAVING COUNT(cus_dun_no) > 1
)

请添加sql标签:)

我认为这会产生您想要的输出:

SELECT CASE 
       WHEN (A.cus_nm LIKE '%(%' AND A.cus_lkp_nm NOT LIKE '%REG%')
       THEN 'N'
       ELSE 'Y'
       END AS Main,
       CASE
       WHEN (A.cus_nm LIKE '%(%' AND A.cus_lkp_nm NOT LIKE '%REG%')
       THEN (SELECT B.cus_cus_no
               FROM arrcus_rec AS B
              WHERE B.cus_dun_no = A.cus_dun_no
                    -- Beware De Morgan
                AND (B.cus_nm NOT LIKE '%(%' OR B.cus_lkp_nm LIKE '%REG%')
            )
       ELSE NULL::INTEGER
       END AS Job_Account,
       *
  FROM arrcus_rec A
 WHERE cus_dun_no IN (
           SELECT cus_dun_no
             FROM arrcus_rec
          --WHERE cus_usg_sts = 'A'
            GROUP BY cus_dun_no
           HAVING COUNT(cus_dun_no) > 1
       )

主 WHERE 子句中的子查询根据图像中给出的数据(突出显示 AFAKORI 的数据)生成答案 6410981。

第二个 CASE 表达式产生了想要的神奇答案。它计算出这一行是否不是主账户,并运行一个子查询来获取相应的主账户,或者 returns NULL::INTEGER (将 NULL 转换为整数类型)如果这是主账户帐号。

示例数据:

cus_cus_no  cus_lkp_nm       cus_nm                           cus_dun_no
      6625  AFAKORI, INC.    AFAKORI, INC.                       6410981
      6694  AFAKORI, (594)   AFAKORI, INC,(LBCCD-BUILDING)       6410981
      6832  AFAKORI, (596)   AFAKORI, INC.(SECURITY COMPLEX)     6410981

显示的查询输出是:

main|job_account|cus_cus_no |cus_lkp_nm .    |cus_nm                          |cus_dun_no |
   Y|           |       6625|AFAKORI, INC.   |AFAKORI, INC.                   |    6410981|
   N|       6625|       6694|AFAKORI, (594)  |AFAKORI, INC,(LBCCD-BUILDING)   |    6410981|
   N|       6625|       6832|AFAKORI, (596)  |AFAKORI, INC.(SECURITY COMPLEX) |    6410981|