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 函數並不能實現組內排序的短板,若無分組排序要求的話,兩者是可以通用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM