我在從 Oracle CLOB 列中獲取最后一個字符時遇到問題。適用于 VARCHAR 列的相同 SQL 不適用于 CLOB 列,并且無法弄清楚為什么或如何使它起作用。
(這適用于從 VARCHAR 獲取最后一個字符)
從 TABLE_NAME 中選擇 substr(COLUMN_NAME, length(COLUMN_NAME), 1)
(當應用于 CLOB 列時,它不會回傳最后一個字符。
從 TABLE_NAME 中選擇 substr(CLOB_COLUMN, length(CLOB_COLUMN), 1)
(以下更新)根據 Alex 的建議,我添加了轉儲/演員表并為該列獲取“ Typ=1 Len=1: 10 ”。(我不知道那是什么)
這是我正在運行的 SQL:
set linesize 32000
select
length(COLUMN_NAME) as clob_length,
substr(trim(COLUMN_NAME), length(trim(COLUMN_NAME)) -50 ) as last_50,
SUBSTR(COLUMN_NAME, -1) as last_char,
dump(cast(substr(COLUMN_NAME, -1) as varchar2(1)))
from TABLENAME
我添加了我使用的 SQL,其中一行的結果是:
CLOB_LENGTH: 1227
LAST_50: shall be permitted to be continued in service
LAST_CHAR:
VARCHAR2(1): Typ=1 Len=1: 10
(我不清楚最后一個值是什么意思)
uj5u.com熱心網友回復:
適用于我的簡單測驗用例:
SQL> create table test (col clob);
Table created.
SQL> insert into test (col) values ('This is a cloB');
1 row created.
SQL> select substr(col, length(col), 1) from test;
SUBSTR(COL,LENGTH(COL),1)
--------------------------------------------------------------------------------
B
雖然,使用起來更簡單substr(col, -1)(取最后一個字符):
SQL> select substr(col, -1) from test;
SUBSTR(COL,-1)
--------------------------------------------------------------------------------
B
SQL>
uj5u.com熱心網友回復:
我添加了轉儲/演員并為該列獲取“Typ = 1 Len = 1:10”
正如您的影像所懷疑的那樣,您的 CLOB 值以換行符結尾(字符 10,這是轉儲輸出顯示的內容),可能還有其他空格,或者如果原始資料來自 Word,則可能是換行符(字符 13)。這就是為什么“最后 50 個”沒有顯示 50 個“正常”字符的原因 - 有多個空行占據了其中一些位置。
如果您想忽略所有這些尾隨字符,您可以更改修剪以包含更多字符,并將其應用于兩個 substr 呼叫;就像是:
substr(rtrim(clob_column, chr(32)||chr(9)||chr(10)||chr(13)), -1)
這將洗掉空格、制表符、新行和換行符的任何組合。
顯示 50 個字符版本的db<>fiddle現在顯示為單行,最后一個字符為 null、'.'、'n'、'e' 等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/417575.html
標籤:
