• ORA-00923: FROM keyword not found where expected


    网上搜索这类错误还是挺多的,只提供我遇到的一种情景。

    本地数据库环境:Oracle10g

    导入别人的项目后,有一段SQL查询总是报如下错误信息:

    Causejava.sql.SQLExceptionORA-00923: 未找到要求的 FROM 关键字

    定位到该段SQL后直接通过工具运行报同样的错误,SQL如下:

    SELECT
        t.depart_id,
        listagg (t.user_name, ','WITHIN GROUP (ORDER BY t.user_name) user_name
    FROM
        depart_user_relation t
    WHERE
        t.depart_id = '20'
    GROUP BY
        t.depart_id

    错误信息如下:

    ORA-00923FROM keyword not found where expected

    原因:listagg withinOracle11g 后引入的,在 Oracle10g 中不支持。


    解决方案:

    1、升级到Oracle11
    2、寻求替代方案

    首先在寻求替代方案之前要了解该函数的作用。

    该函数可以实现按条件实现列转行。 第二个参数可以灵活的选择 “ ,| - ” 等符号。

    我上边那个 SQL 就是想通过 depart_id 进行分组,然后把 user_name 进行列转行。

    上实图,左侧即数据库原始数据,右侧为使用 listagg 函数后的效果。

    WM_CONCAT函数介绍

    wm_concat 函数也可以用作字符串拼接,也是一种聚合函数,也可以用作分析函数,只是函数本身不能像 listagg 那样自由选择间隔字符,固定使用逗号分隔,但可以用其他函数(例如REPLACE)来实现分隔符的改变。唯一无法实现的是,不能自由选择排序的依据,也就是 listagg 中必须使用的 order by 子句。

    WM_CONCAT用法示例

    select depart_id,wm_concat(user_name) 
    from depart_user_relation 
    group by depart_id;

    由于固定的使用逗号分隔符,所以,如果想替换的话可以使用 REPLACE 函数,具体使用如下:

    select depart_id, REPLACE(wm_concat(user_name),',','|')   
    from depart_user_relation 
    group by depart_id;

    这样就实现了 号转 | 了,当然 | 还可以为其他字符。

    最后:尽管采用 wm_concat 函数替代了11g新加入的 listagg 函数,但是 wm_concat 函数并不能实现组内排序的短板,若无分组排序要求的话,两者是可以通用。

  • 相关阅读:
    O(n)回文子串(Manacher)算法
    LightOJ 1282
    LightOJ
    LightOJ
    POJ-2563
    POJ-2398
    POJ-2318
    ZOJ-3318
    [svc]ftp协议数据连接的2种模式
    [py]python中的特殊类class type和类的两面性图解
  • 原文地址:https://www.cnblogs.com/niceyoo/p/11986072.html
Copyright © 2020-2023  润新知