当前位置: 首页 > 面试题库 >

ORACLE-选择对子查询计数

萧心远
2023-03-14
问题内容

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

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

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

查询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;


 类似资料:
  • 主要内容:Oracle子查询简介,Oracle子查询示例在本教程中,您将了解有助于构建更多可读查询的Oracle子查询,并可在不使用复杂联接或联合的情况下编写查询。 Oracle子查询简介 子查询是嵌套在另一个语句(如SELECT,INSERT,UPDATE或DELETE)中的语句。 通常,可以在任何使用表达式的地方使用子查询。 来看看下面这个子查询的例子。 以下查询使用函数从表中返回产品的最高标价: 执行上面查询语句,得到以下结果 - 要查询最贵的产

  • 我想使用QueryDSL库构建select count查询,如下所示: 中选择计数(1) 我创建了下一个代码: 由于结果selectStatement是Next: 能否请一些人建议如何重写上面的代码

  • 问题内容: 我有一个关于MYSQL中的选择查询的问题 我有两个不同的表,我想获得一定的结果 我使用了COUNT方法,该方法只给我结果(> = 1) 但实际上,我想使用包含零的所有计数怎么做? 我的查询是: 第一张桌子:Content_hits 第二张表:Content_tag 结果但不完整 例如:tag_id = 1的Subsrciber6应该具有count(*)= 0 问题答案: 现在,您已经进

  • 问题内容: 我对SQL还是很陌生,试图绕过它,但是有点令人困惑。这是我正在使用的东西的简化版本。 我有这张桌子叫: 上表是人员清单。他们的parent_id列指的是他们的父母。如果表上没有父母,则他们的parent_id为0。 现在,我希望能够获得每组人的单独列表:祖父母,子女和孙子女。 很容易获得祖父母(拉里和凯文),我可以执行以下查询: 但是当涉及到生子(约翰,拉里,杰森和米尔德雷德)和孙子(

  • 我刚开始冬眠。我有两张桌子,有一对多的关系。有两个表格: 这是一个父类,它与图像表有一对多关系 现在我想使用父类的id(即:pashminaId)从类中选择一个 如: 选择IMAGE_NAMETBL_IMAGEPASHMINA_ID='some_digit'; 我怎么能在图像类中传递pashminaId,因为没有它只有一个父类的对象创建。 那么,我如何在Hibernate中实现这一点? 谢谢!希望

  • 问题内容: 我有这两个表: 学生: 班级: 我想给这个名字显示最后一个注册每个classId的学生的名字。这意味着,我应该为classId 1获得一个名称,为classId 2获得一个名称,以此类推。首先获取邮件(之后才知道学生的名字)的解决方案是: 它会打印最大日期,这是可以的,但同时也会为每个日期打印错误的邮件: 这是完全错误的()。因此,当我尝试加入用于获取名称的值时,会得到不正确的值。 换