在一个查询中使用count和case语句

tkclm6bt  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(325)

我几乎不知道如何让它工作。我已经好几年没有真正使用sql了,所以有很多我不记得了。
所以我想这样:
我返回表中代码字段的值为1208且estnumber=1187216的行
对所选内容运行计数,如果为0,则运行子查询
如果>0,则运行其他子查询
我还没有进入子查询部分,因为我根本无法让它正常工作。现在我只想让它返回文本。
这是最新的尝试,我实际上在使用db2,但也许我们现在可以忽略这一点,稍后我会解决这一部分,因为它说明语法不正确,但其他验证器不同意(如果您对db2一无所知,请在给出建议时使用标准sql)

SELECT
  count(*) AS t
FROM
  table
WHERE
  (
    ESTNUMBER = 1187216
    AND CODE = 1208
  )
  AND CASE WHEN t = 0 THEN 'it is zero' ELSE 'it is not zero' END;
km0tfn4u

km0tfn4u1#

你想这样做吗?

WITH c AS (
      SELECT count(*) AS cnt
      FROM table
      WHERE ESTNUMBER = 1187216 AND CODE = 1208
     )
SELECT s1.*
FROM subquery1 s1
WHERE (SELECT cnt FROM c) = 0
UNION ALL
SELECT s2.*
FROM subquery2 s2
WHERE (SELECT cnt FROM c) > 0;

这假设子查询返回的列是兼容的(相同的数目,相同的类型)。
有更好的方法来编写这个查询(特别是使用 EXISTS 以及 NOT EXISTS ),但这与你提问的方式完全一致。

xxe27gdn

xxe27gdn2#

字符串值应该出现在select子句中,而不是where筛选器中。

SELECT
  count(*) AS t,
(CASE WHEN count(*) = 0 THEN 'it is zero' ELSE 'it is not zero' END) display_str
FROM
  table
WHERE
  (
    ESTNUMBER = 1187216
    AND CODE = 1208
  )
3z6pesqy

3z6pesqy3#

你像一个命令式的程序员,而不是一个声明式的。也就是说,sql没有顺序执行:要么全部执行,要么什么都不执行。
所以,这是一个开始,有效的一点:

SELECT count(*) AS t
  FROM table
  WHERE ESTNUMBER = 1187216 AND CODE = 1208

现在,为了检查count()的值,您现在知道where将不起作用。那是因为count是一个聚合函数。为了观察这种函数的结果,你使用having。
为了使您的案例有效,您可以将其移动到可以获得count(
)结果的区域:

SELECT count(*) AS t
    (CASE WHEN count(*) = 0 THEN 'it is zero' ELSE 'it is not zero' END) as msg
  FROM table
  WHERE ESTNUMBER = 1187216 AND CODE = 1208

请注意,“t”是您给出count(*)结果的别名。在大多数sql实现中,该别名不能在语句的其余部分使用。
现在,对于非此即彼的事情,是时候重新考虑你的方法和你真正想要的了。您可能最终会在语句中包含这两个结果集,并选择如何提供结果。
比如:

select a.id, a.ct, (case when a.ct=0 then b.amt else c.amt end) as amt
  from (select id, count(*) as ct from table1) a
    left join (select id, sum(amount) as amt from table2) b on a.id=b.id
    left join (select id, sum(amount) as amt from table3) c on a.id=c.id

希望这有帮助。

相关问题