如何检索Oracle中长度不同的文本列的最后一部分(即长度不同的数字)并将其存储在另一列中?

Posted

技术标签:

【中文标题】如何检索Oracle中长度不同的文本列的最后一部分(即长度不同的数字)并将其存储在另一列中?【英文标题】:How to retrieve the last part (i.e. a number varies in length) of a text column of which's length varies in Oracle and store this in another column? 【发布时间】:2020-11-09 11:24:46 【问题描述】:

我正在尝试从名为 Description 的 Oracle SQL 列中获取最后一个数字,并将其存储在名为 Thickness 的另一列中。

如您所见,描述的长度以及最后数字的长度各不相同。有时是双精度,例如 1.5,有时是整数,例如 3。我尝试在末尾检查“X”,但由于 RIGHT 关键字在 Oracle 中无效,因此没有成功。

提前感谢您的帮助!

【问题讨论】:

请不要将数据发布为图片;将其发布为格式化文本,或者更好的是,发布为 DDL/DML 语句,我们可以复制/粘贴并执行。 【参考方案1】:

一个选项使用regexp_substr()

update mytable 
set thickness = regexp_substr(description, '\d+(\.\d+)?$')

请注意,您可以很好地使用计算列,而不是实际存储此派生信息:

alter table mytable drop column thickness;

alter table mytable
add thickness as (to_number(regexp_substr(description, '\d+(\.\d+)?$')));

Demo on DB Fiddle

【讨论】:

【参考方案2】:

你可以使用包含[:alpha:]模式的REGEXP_SUBSTR()函数

SELECT REGEXP_SUBSTR(description,'[^[:alpha:]]+$') AS thickness
  FROM t

我认为,就数据结构设计而言,无需在列中存储可计算值。但如果您愿意,一个简单的CTAS 语句(如下所示)会有所帮助

CREATE TABLE t AS
WITH t(description) AS
(
 SELECT 'RAAM NIB 319X319X1.5'    FROM dual UNION ALL
 SELECT 'RAAM ZW 327X307X2'       FROM dual UNION ALL
 SELECT 'RAAM ZW 460.5X430.5X2.5' FROM dual 
)
SELECT description, REGEXP_SUBSTR(description,'[^[:alpha:]]+$') AS thickness
  FROM t

Demo

【讨论】:

【参考方案3】:

使用INSTR,位置为-1,从字符串右侧开始查找:

(我已经包括了宽度和高度以及厚度。)

UPDATE table_name
SET width     = TO_NUMBER(
                  SUBSTR(
                    description,
                    INSTR( description, ' ', -1 ) + 1,
                    INSTR( description, 'X', -1, 2 ) - INSTR( description, ' ', -1 ) - 1
                  )
                ),
    height    = TO_NUMBER(
                  SUBSTR(
                    description,
                    INSTR( description, 'X', -1, 2 ) + 1,
                    INSTR( description, 'X', -1, 1 ) - INSTR( description, 'X', -1, 2 ) - 1
                  )
                ),
    thickness = TO_NUMBER(
                  SUBSTR(
                    description,
                    INSTR( description, 'X', -1 ) + 1
                  )
                );

其中,对于样本数据:

CREATE TABLE table_name ( description, width, height, thickness ) AS
SELECT 'RAAM NIB 319X319X1.5', 0, 0, 0 FROM DUAL UNION ALL
SELECT 'RAAM ZW 327X307X2', 0, 0, 0 FROM DUAL;

将值更改为:

说明 |宽度 |高度 |厚度 :-------------------- | ----: | -----: | --------: RAAM 笔尖 319X319X1.5 | 319 | 319 | 1.5 拉姆 ZW 327X307X2 | 327 | 307 | 2

db小提琴here

【讨论】:

以上是关于如何检索Oracle中长度不同的文本列的最后一部分(即长度不同的数字)并将其存储在另一列中?的主要内容,如果未能解决你的问题,请参考以下文章

如何调整oracle中的sql语句输入的最大长度

如何在没有'id'列的MySql中获取最后插入的记录?

如何检索用于在 Oracle 中创建视图的 SQL?

在 SQL Server 中检索 VARCHAR 列的最大长度

如何在TVirtualStringTree中自动调整跨越列的大小?

识别并检索Oracle数据库中所有varchar列的值