gpt4 book ai didi

sql - ORACLE - 在子查询上选择计数

转载 作者:行者123 更新时间:2023-12-02 08:37:03 25 4
gpt4 key购买 nike

我有一个包含一组范围(RangeA 和 RangeB)的 Oracle 表。这些列是 varchar,因为它们可以同时包含数字和字母数字值,如下例所示:

ID|RangeA|RangeB
1 | 10 | 20
2 | 21 | 30
3 | AB50 | AB70
4 | AB80 | AB90

我需要执行一个仅返回具有数值的记录的查询,并对该查询执行计数。到目前为止,我已经尝试使用两个不同的查询来执行此操作,但没有任何运气:

查询 1:

SELECT COUNT(*) FROM (
SELECT RangeA, RangeB FROM table R
WHERE upper(R.RangeA) = lower(R.RangeA)
) A
WHERE TO_NUMBER(A.RangeA) <= 10

查询 2:

WITH A(RangeA,RangeB) AS(
SELECT RangeA, RangeB FROM table
WHERE upper(RangeA) = lower(RangeA)
)
SELECT COUNT(*) FROM A WHERE TO_NUMBER(A.RangeA) <= 10

子查询工作正常,因为我得到了两条只有数值的记录,但查询的 COUNT 部分失败了。我应该只得到 1,但我收到以下错误:

ORA-01722: invalid number
01722. 00000 - "invalid number"

我做错了什么?非常感谢任何帮助。

最佳答案

您可以使用正则表达式测试每一列以确定它是否是有效数字:

SELECT COUNT(1)
FROM table_of_ranges
WHERE CASE WHEN REGEXP_LIKE( RangeA, '^-?\d+(\.\d*)?$' )
THEN TO_NUMBER( RangeA )
ELSE NULL END
< 10
AND REGEXP_LIKE( RangeB, '^-?\d+(\.\d*)?$' );

另一种选择是使用用户定义的函数:

CREATE OR REPLACE FUNCTION test_Number (
str VARCHAR2
) RETURN NUMBER DETERMINISTIC
AS
invalid_number EXCEPTION;
PRAGMA EXCEPTION_INIT(invalid_number, -6502);
BEGIN
RETURN TO_NUMBER( str );
EXCEPTION
WHEN invalid_number THEN
RETURN NULL;
END test_Number;
/

然后你可以这样做:

SELECT COUNT(*)
FROM table_of_ranges
WHERE test_number( RangeA ) <= 10
AND test_number( RangeB ) IS NOT NULL;

关于sql - ORACLE - 在子查询上选择计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20387158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com