如何检索 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?

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

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

在此先感谢您的帮助!

一个选项使用 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

使用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;

将值更改为:

DESCRIPTION          | WIDTH | HEIGHT | THICKNESS
:------------------- | ----: | -----: | --------:
RAAM NIB 319X319X1.5 |   319 |    319 |       1.5
RAAM ZW 327X307X2    |   327 |    307 |         2

db<>fiddle here

您可以使用包含模式 [: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