获取 Oracle CLOB 列中的最后一个字符
Getting the last character in an Oracle CLOB column
我在从 Oracle CLOB 列获取最后一个字符时遇到问题。适用于 VARCHAR 列的相同 SQL 不适用于 CLOB 列,并且无法弄清楚为什么或如何使其工作。
(这适用于从 VARCHAR 中获取最后一个字符)
select substr(COLUMN_NAME, length(COLUMN_NAME), 1) 来自 TABLE_NAME
(应用于 CLOB 列时,它不会 return 最后一个字符。
select substr(CLOB_COLUMN, length(CLOB_COLUMN), 1) 来自 TABLE_NAME
(更新如下)
根据 Alex 的建议,我为该列添加了 dump/cast 并得到“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
(我不清楚最后一个值是什么意思)
适用于我的简单测试用例:
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>
I added the dump/cast and get "Typ=1 Len=1: 10" for that column
正如 your image 怀疑的那样,您的 CLOB 值以新行结尾(字符 10,这是转储输出显示的内容),可能还有其他空格,或者换行符(字符 13),如果原始数据来自,比如说,Word。这就是 'last 50' 没有显示 50 个 'normal' 字符的原因 - 多个空行占据了其中一些位置。
如果您想忽略所有这些尾随字符,您可以更改 trim 以包含更多字符,并将其应用于两个 substr 调用;类似于:
substr(rtrim(clob_column, chr(32)||chr(9)||chr(10)||chr(13)), -1)
这将删除空格、制表符、换行符和换行符的任意组合。
db<>fiddle 显示 50 个字符的版本现在显示为单行,最后一个字符为空、'.'、'n'、'e' 等
我在从 Oracle CLOB 列获取最后一个字符时遇到问题。适用于 VARCHAR 列的相同 SQL 不适用于 CLOB 列,并且无法弄清楚为什么或如何使其工作。
(这适用于从 VARCHAR 中获取最后一个字符)
select substr(COLUMN_NAME, length(COLUMN_NAME), 1) 来自 TABLE_NAME
(应用于 CLOB 列时,它不会 return 最后一个字符。
select substr(CLOB_COLUMN, length(CLOB_COLUMN), 1) 来自 TABLE_NAME
(更新如下) 根据 Alex 的建议,我为该列添加了 dump/cast 并得到“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
(我不清楚最后一个值是什么意思)
适用于我的简单测试用例:
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>
I added the dump/cast and get "Typ=1 Len=1: 10" for that column
正如 your image 怀疑的那样,您的 CLOB 值以新行结尾(字符 10,这是转储输出显示的内容),可能还有其他空格,或者换行符(字符 13),如果原始数据来自,比如说,Word。这就是 'last 50' 没有显示 50 个 'normal' 字符的原因 - 多个空行占据了其中一些位置。
如果您想忽略所有这些尾随字符,您可以更改 trim 以包含更多字符,并将其应用于两个 substr 调用;类似于:
substr(rtrim(clob_column, chr(32)||chr(9)||chr(10)||chr(13)), -1)
这将删除空格、制表符、换行符和换行符的任意组合。
db<>fiddle 显示 50 个字符的版本现在显示为单行,最后一个字符为空、'.'、'n'、'e' 等