Oracle SUBSTR 导致列更长?

问题描述 投票:0回答:1

似乎

SUBSTR
会导致更长列?这是怎么回事?

CREATE TABLE t (
    long_field VARCHAR2(1024)
);
SELECT
    column_name,
    data_length
FROM
    all_tab_cols
WHERE
    table_name = 'T';
COLUMN_NAME 数据长度
LONG_FIELD 1024
INSERT INTO t ( long_field ) VALUES ( 'abcdef' );

CREATE TABLE t2
    AS
        SELECT
            substr(long_field, instr(long_field, 'c') + 1) short_field
        FROM
            t;
SELECT
    column_name,
    data_length
FROM
    all_tab_cols
WHERE
    table_name = 'T2';
COLUMN_NAME 数据长度
SHORT_FIELD 4096

我使用的是 Oracle 18:

select BANNER
from V$VERSION;
横幅
Oracle Database 18c Express 版 18.0.0.0.0 - 生产版
oracle substr
1个回答
0
投票

SUBSTR
返回
VARCHAR2(4000)
,因为这是函数可以返回的最大长度子字符串。

仅仅因为您的函数

substr(long_field, instr(long_field, 'c') + 1)
返回
'def'
并不意味着它会更改数据类型以使其数据长度受数据(即
VARCHAR2(3)
)限制,因为
SUBSTR
仍然可以(对于其他数据)返回一个 4000 字节的字符串。

如果您想要较短的数据长度,请使用

CAST
:

CREATE TABLE t3 AS
  SELECT CAST(
           substr(long_field, instr(long_field, 'c') + 1)
           AS VARCHAR2(10)
         ) short_field
  FROM   t;

那么数据字典将包含:

表名称 COLUMN_NAME 数据长度
T3 SHORT_FIELD 10
T2 SHORT_FIELD 4000

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.