它无法在对 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”列中选择您想要的内容。这比使用SUBSTR
和LOCATE
更灵活,并且会避免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(*)的主要内容,如果未能解决你的问题,请参考以下文章