如何检索 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+)?$')));
使用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
我正在尝试从名为 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+)?$')));
使用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