SQL 解析数字数据的列字符串并存储在单独的列中
SQL parse column string for numerical data and store in separate columns
我正在使用 Oracle SQL 并且想从通常像
这样的单列字符串中解析
suitjacket 899, height195cm weight80kg male
blazerjacket 1099, height170cm weight65kg female
pants 299, height160cm weight89kgs male
coat 1099, height165cms weight60.5kg female
请注意,有时单位是复数,最后会有额外的 's'。如何使用符合 Oracle 的 SQL 查询将 height
和 weight
数据提取到它们自己单独的列中?
| height | weight |
-------------------
| 195 | 80 |
| 170 | 65 |
| 160 | 89 |
| 165 | 60.5 |
我想我必须使用 substring
或 regex
。 substring
似乎不合适,因为字符串中的数据位置不固定。 regex
似乎更好,但我不确定如何制作 regex
然后将其存储在单独的列中,一列用于 height
,一列用于 weight
。
给出示例设置:
CREATE TABLE tbl
(field varchar(48));
INSERT INTO tbl (field) VALUES ('suitjacket 899, height195cm weight80kg male');
INSERT INTO tbl (field) VALUES ('blazerjacket 1099, height170cm weight65kg female');
INSERT INTO tbl (field) VALUES ('pants 299, height160cm weight89kgs male');
INSERT INTO tbl (field) VALUES ('coat 1099, height165cms weight60.5kg female');
您可以结合使用 regexp_substr 和 replace 函数,如下所示:
select to_number(regexp_substr(field, 'height(\d+\.?\d+)', 1, 1, 'i', 1)) height,
to_number(regexp_substr(field, 'weight(\d+\.?\d+)', 1, 1, 'i', 1)) weight
from tbl;
这是一个demo of the above. And here are some references: regexp_substr, replace, regex cheat sheet
祝你好运!
使用简单的 SUBSTR 和 INSTR 比正则表达式快得多。
让我们看一个有效的测试用例:
SQL> WITH DATA AS(
2 SELECT 'suitjacket 899, height195cm weight80kg male' str FROM dual UNION ALL
3 SELECT 'blazerjacket 1099, height170cm weight65kg female' str FROM dual UNION ALL
4 SELECT 'pants 299, height160cm weight89kgs male' str FROM dual UNION ALL
5 SELECT 'coat 1099, height165cms weight60.5kg female' str FROM dual
6 )
7 SELECT
8 SUBSTR(str, instr(str, 'height', 1) + LENGTH('height'), instr(str, 'cm', 1) - instr(str, 'height', 1) - LENGTH('height')) height,
9 SUBSTR(str, instr(str, 'weight', 1) + LENGTH('weight'), instr(str, 'kg', 1) - instr(str, 'weight', 1) - LENGTH('weight')) weight,
10 str
11 FROM DATA
12 /
HEIGHT WEIGHT STR
---------- ---------- ----------------------------------------------------------------------------------------------------
195 80 suitjacket 899, height195cm weight80kg male
170 65 blazerjacket 1099, height170cm weight65kg female
160 89 pants 299, height160cm weight89kgs male
165 60.5 coat 1099, height165cms weight60.5kg female
SQL>
您的查询(将 table_name 替换为您实际的 table):
SELECT SUBSTR(str, instr(str, 'height', 1) + LENGTH('height'), instr(str, 'cm', 1) - instr(str, 'height', 1) - LENGTH('height')) height,
SUBSTR(str, instr(str, 'weight', 1) + LENGTH('weight'), instr(str, 'kg', 1) - instr(str, 'weight', 1) - LENGTH('weight')) weight,
str
FROM table_name
/
我正在使用 Oracle SQL 并且想从通常像
这样的单列字符串中解析suitjacket 899, height195cm weight80kg male
blazerjacket 1099, height170cm weight65kg female
pants 299, height160cm weight89kgs male
coat 1099, height165cms weight60.5kg female
请注意,有时单位是复数,最后会有额外的 's'。如何使用符合 Oracle 的 SQL 查询将 height
和 weight
数据提取到它们自己单独的列中?
| height | weight |
-------------------
| 195 | 80 |
| 170 | 65 |
| 160 | 89 |
| 165 | 60.5 |
我想我必须使用 substring
或 regex
。 substring
似乎不合适,因为字符串中的数据位置不固定。 regex
似乎更好,但我不确定如何制作 regex
然后将其存储在单独的列中,一列用于 height
,一列用于 weight
。
给出示例设置:
CREATE TABLE tbl
(field varchar(48));
INSERT INTO tbl (field) VALUES ('suitjacket 899, height195cm weight80kg male');
INSERT INTO tbl (field) VALUES ('blazerjacket 1099, height170cm weight65kg female');
INSERT INTO tbl (field) VALUES ('pants 299, height160cm weight89kgs male');
INSERT INTO tbl (field) VALUES ('coat 1099, height165cms weight60.5kg female');
您可以结合使用 regexp_substr 和 replace 函数,如下所示:
select to_number(regexp_substr(field, 'height(\d+\.?\d+)', 1, 1, 'i', 1)) height,
to_number(regexp_substr(field, 'weight(\d+\.?\d+)', 1, 1, 'i', 1)) weight
from tbl;
这是一个demo of the above. And here are some references: regexp_substr, replace, regex cheat sheet
祝你好运!
使用简单的 SUBSTR 和 INSTR 比正则表达式快得多。
让我们看一个有效的测试用例:
SQL> WITH DATA AS(
2 SELECT 'suitjacket 899, height195cm weight80kg male' str FROM dual UNION ALL
3 SELECT 'blazerjacket 1099, height170cm weight65kg female' str FROM dual UNION ALL
4 SELECT 'pants 299, height160cm weight89kgs male' str FROM dual UNION ALL
5 SELECT 'coat 1099, height165cms weight60.5kg female' str FROM dual
6 )
7 SELECT
8 SUBSTR(str, instr(str, 'height', 1) + LENGTH('height'), instr(str, 'cm', 1) - instr(str, 'height', 1) - LENGTH('height')) height,
9 SUBSTR(str, instr(str, 'weight', 1) + LENGTH('weight'), instr(str, 'kg', 1) - instr(str, 'weight', 1) - LENGTH('weight')) weight,
10 str
11 FROM DATA
12 /
HEIGHT WEIGHT STR
---------- ---------- ----------------------------------------------------------------------------------------------------
195 80 suitjacket 899, height195cm weight80kg male
170 65 blazerjacket 1099, height170cm weight65kg female
160 89 pants 299, height160cm weight89kgs male
165 60.5 coat 1099, height165cms weight60.5kg female
SQL>
您的查询(将 table_name 替换为您实际的 table):
SELECT SUBSTR(str, instr(str, 'height', 1) + LENGTH('height'), instr(str, 'cm', 1) - instr(str, 'height', 1) - LENGTH('height')) height,
SUBSTR(str, instr(str, 'weight', 1) + LENGTH('weight'), instr(str, 'kg', 1) - instr(str, 'weight', 1) - LENGTH('weight')) weight,
str
FROM table_name
/