Oracle函数REGEXP_SUBSTR的使用

好的,让我们逐步解析这个 SQL 查询的作用和细节。该查询使用了 Oracle SQL 函数来处理和分析 `T_BASELOG_AGENT_SESSION_INFO_TEST` 表中的数据。下面是详细的解释:

### 查询解析

```sql
SELECT REGEXP_SUBSTR(AREANO, '[^,]+', 1, 2) AS OBJID, COUNT(*) AS VAL
FROM T_BASELOG_AGENT_SESSION_INFO_TEST 
WHERE REGEXP_LIKE(AREANO, '^([^,]+),([^,]+),([^,]+)$') 
GROUP BY REGEXP_SUBSTR(AREANO, '[^,]+', 1, 2);
```

#### 1. `REGEXP_SUBSTR` 函数

- **作用**: 从 `AREANO` 列中提取子字符串,使用正则表达式模式。
- **模式**: `[^,]+`
  - `[^,]+` 匹配一个或多个非逗号字符。这个模式用于提取以逗号分隔的字段。
- **参数**:
  - `AREANO`: 要提取子字符串的列。
  - `[^,]+`: 正则表达式模式。
  - `1`: 搜索的起始位置。
  - `2`: 要返回的匹配项的出现次数(在本例中是第二个逗号分隔的值)。

在 `SELECT` 子句中:
```sql
REGEXP_SUBSTR(AREANO, '[^,]+', 1, 2) AS OBJID
```
这段代码提取 `AREANO` 列的第二个逗号分隔段,并将其别名为 `OBJID`。

#### 2. `REGEXP_LIKE` 函数

- **作用**: 根据 `AREANO` 是否匹配正则表达式模式来筛选行。
- **模式**: `^([^,]+),([^,]+),([^,]+)$`
  - 这个模式确保 `AREANO` 列中有且仅有三个由逗号分隔的段。
  - `^` 表示字符串的开始。
  - `([^,]+),([^,]+),([^,]+)` 匹配恰好三个逗号分隔的段。
  - `$` 表示字符串的结束。

在 `WHERE` 子句中:
```sql
REGEXP_LIKE(AREANO, '^([^,]+),([^,]+),([^,]+)$')
```
这个条件筛选出 `AREANO` 列中恰好有三个逗号分隔值的行。

#### 3. `COUNT(*)` 函数

- **作用**: 计算每个分组的行数。
- **在 `SELECT` 子句中**:
```sql
COUNT(*) AS VAL
```
统计每个 `OBJID` 值的行数。

#### 4. `GROUP BY` 子句

- **作用**: 按 `OBJID` 分组以聚合结果。
- **在 `GROUP BY` 子句中**:
```sql
GROUP BY REGEXP_SUBSTR(AREANO, '[^,]+', 1, 2)
```
将结果按提取出的第二个逗号分隔段 (`OBJID`) 进行分组,以便对每个 `OBJID` 计算行数。

### 总结

这个查询从表 `T_BASELOG_AGENT_SESSION_INFO_TEST` 中筛选出 `AREANO` 列包含正好三个逗号分隔段的行。然后,它提取每行的第二个逗号分隔段,计算每个不同的 `OBJID` 的出现次数,并将这些统计结果返回。最终结果展示了每个 `OBJID` 和它在数据中的出现次数。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值