如何检索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中长度不同的文本列的最后一部分(即长度不同的数字)并将其存储在另一列中?的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 中检索 VARCHAR 列的最大长度