0%

拼接sql查询列之wm_concat()函数

讲一下在之前工作中碰到的问题:

业务场景

  1. 前台通过深度学习识别图片上的数字编号把数据通过OPC方式传到后台.
  2. 后台进行接收写入到数据库.
  3. 报表系统通过查询图片对应的数据获取到图片上的编号信息.

业务剖析

三个步骤看起来不是很难,一个数据交互的场景,一个查询回显的场景.

但是在数据交互这里,和传输方测试数据时发现了几个大坑…


深度学习在识别编号后是以ASCLL码的格式写入到Channel信道里的. 而且每个中间还加了分隔符(大概是分隔符或者类似分隔符的一种格式).
我这边去读取就算配置了读取长度也无法读取整串编号. 而且编号还是以ASCLL码格式呈现.
然后就造成了写入了多比数据到数据库(ASCLL码直接转换,但读取无法修改只能通过)

然后就有了类似下面的这种数据:

1
2
3
4
5
6
| id   | Value | Paramid | update_time         |
| ---- | ----- | ------- | ---------------- |
| 0123 | 0 | 1000002 | 2020/05/16 02:11:23 |
| 0123 | 2 | 1000003 | 2020/05/16 02:11:23 |
| 0123 | 3 | 1000004 | 2020/05/16 02:11:23 |
| 0123 | 1 | 1000005 | 2020/05/16 02:11:23 |

但实际上的我需要的结果是这样的:

1
2
3
| id   | Value | Paramid | update_time         |
| ---- | ----- | ------- | ---------------- |
| 0123 | 0231 | 1000005 | 2020/05/16 02:11:23 |

查了一下,发现在oracle中实现了功能的这个函数叫wm_concat().

传入的参数为分组的字段名,查询出来的结果通过,来拼接的.

demo:

1
2
3
4
5
select t1.id,t2.Values,t1.update_time
from table t1,
(select id,wm_concat(Value) as Values
from table group by id) t2
where t1.id = t2.id

output:

1
2
3
| id   | Values   | Paramid | update_time         |
| ---- | -------- | ------- | ---------------- |
| 0123 | 0,2,3,1 | 1000005 | 2020/05/16 02:11:23 |

这个时候就很简单了,用replace()来把,替换成空字符就可以了.
demo:

1
2
3
4
5
select t1.id,t2.Values,t1.update_time
from table t1,
(select id,replace(wm_concat(Value),',','') as Values
from table group by id) t2
where t1.id = t2.id

output:

1
2
3
| id   | Value | Paramid | update_time         |
| ---- | ----- | ------- | ---------------- |
| 0123 | 0231 | 1000005 | 2020/05/16 02:11:23 |