代码之家  ›  专栏  ›  技术社区  ›  tahzibi.jafar

获取ORA-01722:无效数字错误,执行查询时

  •  0
  • tahzibi.jafar  · 技术社区  · 2 年前

    在Orale的三个版本(11g、12c、21c)中,我创建了 mytable 如下所示:

    create table mytable (id number, log_time date)
    

    然后我在表中插入了一些数据,

    insert into mytable values (1, sysdate);
    insert into mytable values (2, sysdate);
    

    之后,我执行了以下查询:

    select      to_char(log_time, 'YYYYMMDD HH24:MI') log_time, count (*)
    from        mytable 
    group by    to_char(log_time, 'YYYYMMDD HH24:MI')
    order  by   to_char(log_time, 'YYYYMMDD HH24:MI')
    

    但我明白 ORA-01722: invalid number 错误

    是虫子还是别的什么?

    2 回复  |  直到 2 年前
        1
  •  2
  •   MT0    2 年前

    定义别名时 log_time 在中 SELECT 子句,然后使用 日志时间 在中再次 ORDER BY 子句,那么您引用的是别名值,而不是基础表值。

    当您使用 order by to_char(log_time, 'YYYYMMDD HH24:MI') 查询实际上与以下内容相同:

    select      to_char(log_time, 'YYYYMMDD HH24:MI') log_time, count (*)
    from        mytable 
    group by    to_char(log_time, 'YYYYMMDD HH24:MI')
    order  by   to_char(to_char(mytable.log_time, 'YYYYMMDD HH24:MI'), 'YYYYMMDD HH24:MI')
    

    因为你正在申请 TO_CHAR 到已经具有的别名值 TO_CHAR 在中应用于它 选择 条款这个 TO_CHAR 函数采用 NUMBER 或者 DATE 作为第一个参数和初始参数 TO_CHAR 在中 选择 生成一个字符串,然后对第二个进行隐式强制转换 TO_CHAR 在中 订单依据 子句,并且默认尝试将字符串转换为 数字 -它会因您看到的错误而失败。


    要解决此问题,您只需要使用别名:

    select      to_char(log_time, 'YYYYMMDD HH24:MI') log_time, count (*)
    from        mytable 
    group by    to_char(log_time, 'YYYYMMDD HH24:MI')
    order  by   log_time
    

    或者,明确使用 mytable.log_time 以引用基础表值(而不是别名):

    select      to_char(log_time, 'YYYYMMDD HH24:MI') log_time, count (*)
    from        mytable 
    group by    to_char(log_time, 'YYYYMMDD HH24:MI')
    order  by   to_char(mytable.log_time, 'YYYYMMDD HH24:MI')
    

    对于样本数据,两者都输出:

    日志时间 计数(*)
    20240515 13:21 2.

    fiddle

        2
  •  0
  •   hossein ruzbahan    2 年前

    问题是按子句排序,请写下:

    select to_char(log_time, 'YYYYMMDD HH24:MI') log_time, count(*)
    

    来自神话 按to_char分组(log_time,'YYYYMMDD HH24:MI') 按log_time排序;