场景说明
在日常数据库设计中,为了简化字段结构,
我们有时会将多选项值(如复选框结果)以逗号分隔的字符串形式存储。
例如:
czjg 字段值:'01,03,05'
这些代码代表不同的含义(如处理结果项),我们在展示或查询时,往往需要将其转换成对应的名称列表。
目标
将逗号分隔的代码字段
(如 "01,03")转换为对应的名称(如 "合格,不合格")。
sql 实现方式
使用 listagg + 子查询 + like 模糊匹配的方式进行实现:
select
pkid,
(
select
listagg(b.mc, ',') within group (order by b.dm)
from
zhxg_xtgl_dmk_cl b
where
b.dmbz = 'xlzx_zdgzxs_czjg'
and (',' || t.czjg || ',') like '%,' || b.dm || ',%'
) as czjgmc
from
shxd_xlzx_zdgz_gzsf t;核心原理解析
| 技术点 | 说明 |
|---|---|
| listagg | oracle聚合函数,用于将多行合并为一行,用分隔符连接 |
| within group | 定义聚合排序方式 |
| `(',' |
示例
| czjg(代码) | 对应名称 |
|---|---|
| '01,03' | '合格,不合格' |
总结
这种写法适用于逗号分隔的多值字段与码表字段之间的多对多转换展示,在报表、页面渲染时非常实用。
如果你正在开发 oracle 项目,有这类存储结构,可以直接套用以上 sql!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论