在Oracle里用正则表达式实现行列转换
时间: 2024-02-06 16:09:01 浏览: 118
Oracle中使用正则表达式
3星 · 编辑精心推荐
在Oracle中,可以使用正则表达式和一些SQL函数来实现行列转换。以下是一个示例:
假设我们有以下表格:
```
CREATE TABLE fruits (
id NUMBER,
name VARCHAR2(20),
color VARCHAR2(20)
);
INSERT INTO fruits VALUES (1, 'apple', 'red');
INSERT INTO fruits VALUES (2, 'banana', 'yellow');
INSERT INTO fruits VALUES (3, 'orange', 'orange');
INSERT INTO fruits VALUES (4, 'grape', 'purple');
```
我们想要将行转换为列,即将每个水果的名称和颜色放在同一行上。可以使用以下查询:
```
SELECT id,
MAX(CASE WHEN REGEXP_LIKE(attribute, 'name') THEN value END) AS name,
MAX(CASE WHEN REGEXP_LIKE(attribute, 'color') THEN value END) AS color
FROM (
SELECT id,
REGEXP_SUBSTR(attribute_value, '[^:]+', 1, 1) AS attribute,
REGEXP_SUBSTR(attribute_value, '[^:]+', 1, 2) AS value
FROM (
SELECT id, REGEXP_REPLACE(REGEXP_REPLACE(attribute_value, '^{|}$'), '"', '') AS attribute_value
FROM (
SELECT id,
REGEXP_REPLACE(REGEXP_REPLACE(JSON_QUERY(attributes, '$.name'), '^"|"$'), '\"\"', '') || ':' ||
REGEXP_REPLACE(REGEXP_REPLACE(JSON_QUERY(attributes, '$.value'), '^"|"$'), '\"\"', '') AS attribute_value
FROM fruits
)
)
)
GROUP BY id;
```
这个查询使用了一些Oracle的函数和正则表达式:
- `JSON_QUERY`:从JSON字符串中提取属性名称和值。
- `REGEXP_REPLACE`:删除JSON字符串中的引号和花括号。
- `REGEXP_SUBSTR`:从属性值字符串中提取属性名称和值。
- `REGEXP_LIKE`:检查属性名称是否为“name”或“color”。
- `MAX(CASE WHEN ... THEN ... END)`:将每个属性名称的值转换为列。
运行以上查询后,将会得到以下结果:
```
ID NAME COLOR
1 apple red
2 banana yellow
3 orange orange
4 grape purple
```
注意,这只是一个示例查询,如果您的数据结构不同,那么您需要相应地更改查询以适应您的数据。
阅读全文