它无法在对 DB2 数据库的查询中计算 count(*)

Posted

技术标签:

【中文标题】它无法在对 DB2 数据库的查询中计算 count(*)【英文标题】:It can't calculate count(*) in a query onto DB2 database 【发布时间】:2020-03-30 17:00:47 【问题描述】:

我想对 DB2 数据库的行数进行计数(*)。 基本查询如下:

select 
SUBSTR("Request_Detail",LOCATE('/',"Request_Detail")+1,LOCATE('/',"Request_Detail",LOCATE('/',"Request_Detail")+1)-LOCATE('/',"Request_Detail"))

 from "Request_Analisys"

 WHERE
 "Sample_Date_and_Time">=1200323230000000 and "Sample_Date_and_Time"<1200332300000000
 and "Request_Detail" <> '[Summary]'
 and "Request_Detail" not like 'WS:%'

现在我想对结果行进行计数(*),但如果我执行这样的查询:

select 
count(*),
SUBSTR("Request_Detail",LOCATE('/',"Request_Detail")+1,LOCATE('/',"Request_Detail",LOCATE('/',"Request_Detail")+1)-LOCATE('/',"Request_Detail"))

 from "Request_Analisys"

 WHERE
 "Sample_Date_and_Time">=1200323230000000 and "Sample_Date_and_Time"<1200332300000000
 and "Request_Detail" <> '[Summary]'
 and "Request_Detail" not like 'WS:%'

它给出了错误:

18:51:58 FAILED [SELECT - 0 rows, 0.032 secs] 1) [Code: -119, SQL State: 42803] 在 SELECT 子句、HAVING 子句或 ORDER BY 中指定的以“Request_Detail”开头的表达式GROUP BY 子句中未指定子句,或者它位于具有列函数的 SELECT 子句、HAVING 子句或 ORDER BY 子句中且未指定 GROUP BY 子句。SQLCODE=-119,SQLSTATE=42803,DRIVER=4.22。 29 2) [代码:-727,SQL 状态:56098] 隐式系统操作类型“2”期间发生错误。为错误返回的信息包括 SQLCODE“-119”、SQLSTATE“42803”和消息标记“Request_Detail”.. SQLCODE=-727, SQLSTATE=56098, DRIVER=4.22.29

如何获取行数?

【问题讨论】:

select count(*) from (your-basic-query)。如果不是您想要的,请提供您的基本查询返回的结果集示例以及您想要获得的结果。 【参考方案1】:

您认为它会在计数后显示哪个Request_Detail 行的子字符串? 如果计算行数,结果集将是一行,使用其中的任何列都没有意义。

如果你想要多行,每个找到的子字符串都有一个计数,你需要GROUP BY这个子字符串。

【讨论】:

是的,但是如果我添加 group by 子句,我会收到以下错误:[代码:-138,SQL 状态:22011] 该语句未执行,因为标量函数的数字参数已输出范围.. SQLCODE=-138, SQLSTATE=22011, DRIVER=4.22.29【参考方案2】:

这可能有效...

select 
count(
SUBSTR("Request_Detail"
       ,LOCATE('/',"Request_Detail")+1
       ,LOCATE('/',"Request_Detail",LOCATE('/',"Request_Detail")+1)
          -LOCATE('/',"Request_Detail")))
)
 from "Request_Analisys"
 WHERE
 "Sample_Date_and_Time">=1200323230000000 and "Sample_Date_and_Time"<1200332300000000
 and "Request_Detail" <> '[Summary]'
 and "Request_Detail" not like 'WS:%'

但如果不是这样应该..

with cte as (
select 
SUBSTR("Request_Detail"
       ,LOCATE('/',"Request_Detail")+1
       ,LOCATE('/',"Request_Detail",LOCATE('/',"Request_Detail")+1)
          -LOCATE('/',"Request_Detail"))) as mydetail
 from "Request_Analisys"
 WHERE
 "Sample_Date_and_Time">=1200323230000000 and "Sample_Date_and_Time"<1200332300000000
 and "Request_Detail" <> '[Summary]'
 and "Request_Detail" not like 'WS:%'
)
select count(*) from cte

【讨论】:

【参考方案3】:

我建议您使用REGEXP_EXTRACT 从“Request_Detail”列中选择您想要的内容。这比使用SUBSTRLOCATE 更灵活,并且会避免statement was not executed because a numeric argument of a scalar function is out of range.. 错误

例如

select
    REGEXP_EXTRACT("Request_Detail",'.*/(.+/)',1,1,'',1)
,   SUBSTR("Request_Detail",LOCATE('/',"Request_Detail")+1,LOCATE('/',"Request_Detail",LOCATE('/',"Request_Detail")+1)-LOCATE('/',"Request_Detail"))
FROM TABLE(VALUES('aaaa/bbbb/ccc')) AS T("Request_Detail")

返回

1     |2    
------|-----
bbbb/ |bbbb/

所以,你可以这样做

SELECT
    COUNT(*)
,   REGEXP_EXTRACT("Request_Detail",'.*/(.+/)',1,1,'',1)
FROM
     "Request_Analisys"
GROUP BY
    REGEXP_EXTRACT("Request_Detail",'.*/(.+/)',1,1,'',1)

例如

【讨论】:

以上是关于它无法在对 DB2 数据库的查询中计算 count(*)的主要内容,如果未能解决你的问题,请参考以下文章

DB2 中联合查询的重复数据删除

在 DB2 中更改表后无法查询

如何从具有子句的 DB2 中获取 count(*) 总数?

Db2 事务日志已锁定,无法归档

在 php 中打印来自 db2 查询的单个结果

由于计数,db2/sql 查询不允许从连接中选择静态值