请教字符串替换

[复制链接]
查看11 | 回复7 | 2013-2-25 14:51:24 | 显示全部楼层 |阅读模式
字符串1:'1G8M8WQ', 字符串2:'12345UY'
要把字符串1的8改成字符串2相应位置的3和5
也就是 变成 '1G3M5WQ'
谢谢
字符串1的8的位置和个数不确定
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
规则不明确
s2比s1短,8没有对应的字符的情况怎么办?
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
原帖由 lastwinner 于 2011-6-10 18:52 发表
规则不明确
s2比s1短,8没有对应的字符的情况怎么办?

s2和s1一定一样长
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
用pl/sql去实现吧
一条sql也可以实现,但没必要做那么复杂
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
一个字符串的:
SELECT LISTAGG(NVL(NULLIF(SUBSTR(str1,LEVEL,1),'8'),SUBSTR(str2,LEVEL,1))) WITHIN GROUP (ORDER BY LEVEL)
FROM (SELECT '1G8M8WQ' str1,'12345UY' str2 FROM DUAL)
CONNECT BY LEVEL<=LENGTH(str1)
1G3M5WQ
多个字符串的:
WITH t AS (
SELECT 1 id,'1G8M8WQ' str1,'12345UY' str2 FROM DUAL
UNION ALL
SELECT 2 id,'TEST18ASDF8123' str1,'98723472390470' str2 FROM DUAL
UNION ALL
SELECT 3 id,'673#$#$8-+ER^%$838KLJRT' str1,'PJ;LQWREKJRFDSLKJEROIWE' str2 FROM DUAL
)
SELECT id,LISTAGG(NVL(NULLIF(SUBSTR(str1,LEVEL,1),'8'),SUBSTR(str2,LEVEL,1))) WITHIN GROUP (ORDER BY LEVEL)
FROM t
CONNECT BY id = PRIOR id AND LEVEL<=LENGTH(str1) AND PRIOR SYS_GUID() IS NOT NULL
GROUP BY id;
11G3M5WQ
2TEST14ASDF0123
3673#$#$E-+ER^%$K3EKLJRT

如果没有LISTAGG:
WITH t AS (
SELECT 1 id,'1G8M8WQ' str1,'12345UY' str2 FROM DUAL
UNION ALL
SELECT 2 id,'TEST18ASDF8123' str1,'98723472390470' str2 FROM DUAL
UNION ALL
SELECT 3 id,'673#$#$8-+ER^%$838KLJRT' str1,'PJ;LQWREKJRFDSLKJEROIWE' str2 FROM DUAL
)
SELECT id,REPLACE(MAX(SYS_CONNECT_BY_PATH(NVL(NULLIF(SUBSTR(str1,LEVEL,1),'8'),SUBSTR(str2,LEVEL,1)),'\')),'\')
FROM t
CONNECT BY id = PRIOR id AND LEVEL<=LENGTH(str1) AND PRIOR SYS_GUID() IS NOT NULL
GROUP BY id;
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
这种东西为什么跑oracle里搞呢?不明白
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
good
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
谢谢各位
主要要考虑性能,这样还不如写个自定义函数了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行