oracle一个sql怎么写

solidvacuum 2017-11-01 11:19:26
背景:中文名中有个各种特殊字符,需要按照一个转化表,批量修改中文名。
转换表表名zhuanma,两个字段
prezf afterzf
Ⅱ 2
Ⅲ 3
。。。映射表内容较多


中文名表名是BJDZ,一个字段bjmc
bjmc
暖风水管Ⅲ
晴纶II组件
内容也很多

我初步的设想,通过游标对bjdz每一条数据,对zhuanma表规则进行循环查找替换,
但是总觉得这样操作效率低,请各位大神指点迷津。
...全文
414 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
solidvacuum 2017-11-01
  • 打赏
  • 举报
回复
引用 3 楼 qq646748739 的回复:
原始数据是什么? 转换之后的数据是什么?
比如原数据 暖风水管Ⅲ 转换后 暖风水管3
碧水幽幽泉 2017-11-01
  • 打赏
  • 举报
回复
原始数据是什么? 转换之后的数据是什么?
solidvacuum 2017-11-01
  • 打赏
  • 举报
回复
引用 1 楼 qq646748739 的回复:
你希望实现什么样的效果。这个必须说下!
您好,效果就是中文名按照规则替换局部字符。
碧水幽幽泉 2017-11-01
  • 打赏
  • 举报
回复
你希望实现什么样的效果。这个必须说下!
solidvacuum 2017-11-01
  • 打赏
  • 举报
回复
已通过如下方式实现:

BEGIN
  for cur1 in (select *
                 from ZHUANMA) loop
    update BJDZ set BJMC = REPLACE(BJMC, cur1.PREZF, cur1.aferzf) ;
    commit;
  END LOOP;
  end;
感谢chengccy指点。
chengccy 2017-11-01
  • 打赏
  • 举报
回复
引用 8 楼 solidvacuum 的回复:
[quote=引用 7 楼 chengccy 的回复:] 那就是bjmc中会多次出现映射表的值?
对的,比如说英文括号,其实就是左右括号两次。[/quote] SELECT T.BJMC, TRANSLATE(BJMC, LISTAGG(T1.PREZF) WITHIN GROUP(ORDER BY T.BJMC), LISTAGG(T1.AFTERZF) WITHIN GROUP(ORDER BY T.BJMC)) FROM BJDZ T LEFT JOIN ZHUANMA T1 ON INSTR(BJMC, PREZF) > 0 GROUP BY T.BJMC 更新语句需要使用merge into
碧水幽幽泉 2017-11-01
  • 打赏
  • 举报
回复
引用 8 楼 solidvacuum 的回复:
[quote=引用 7 楼 chengccy 的回复:]
那就是bjmc中会多次出现映射表的值?

对的,比如说英文括号,其实就是左右括号两次。[/quote]
使用regexp_replace,可以解决你的问题。
solidvacuum 2017-11-01
  • 打赏
  • 举报
回复
引用 7 楼 chengccy 的回复:
那就是bjmc中会多次出现映射表的值?
对的,比如说英文括号,其实就是左右括号两次。
chengccy 2017-11-01
  • 打赏
  • 举报
回复
那就是bjmc中会多次出现映射表的值?
solidvacuum 2017-11-01
  • 打赏
  • 举报
回复
引用 5 楼 chengccy 的回复:
如果bjmc中只会出现一次映射表的话可以这么写: select:
SELECT T.BJMC, REPLACE(BJMC, PREZF, AFTERZF)
FROM   BJDZ T
LEFT   JOIN ZHUANMA T1
ON     INSTR(BJMC, PREZF) > 0
update :
UPDATE BJDZ T
SET    T.BJMC =
        (SELECT MAX(REPLACE(BJMC, PREZF, AFTERZF))
         FROM   ZHUANMA T1
         WHERE  INSTR(BJMC, PREZF) > 0)
您好,这么写有点点问题, 如果原字符是 II螺栓III 按你这个转换后是两条结果 2螺栓III和II螺栓3
chengccy 2017-11-01
  • 打赏
  • 举报
回复
如果bjmc中只会出现一次映射表的话可以这么写: select:
SELECT T.BJMC, REPLACE(BJMC, PREZF, AFTERZF)
FROM   BJDZ T
LEFT   JOIN ZHUANMA T1
ON     INSTR(BJMC, PREZF) > 0
update :
UPDATE BJDZ T
SET    T.BJMC =
        (SELECT MAX(REPLACE(BJMC, PREZF, AFTERZF))
         FROM   ZHUANMA T1
         WHERE  INSTR(BJMC, PREZF) > 0)

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧