我想知道如何编辑oracle DB中存在的以下列
PPPPFPPPPPPPPPPPPPPPPPPPPPPPPFPPPPPPPP
我只想将F
设置为P
而不影响其他结构。
我有大约700条记录,我想将所有用户的位置(第5位)更改为P
我在想PLSQL而不是查询,所以请你指点一下。
谢谢
答案 0 :(得分:1)
> SELECT REGEXP_REPLACE('PPPPFPPPPPPPPPPPPPPPPPPPPPPPPFPPPPPPPP', '^(\w{4}).(.*)', '\1P\2') AS COL_REGX FROM dual
COL_REGX
--------------------------------------
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPFPPPPPPPP
答案 1 :(得分:0)
Klashxx答案很好 - REGEXP_REPLACE是要走的路。老式的方式一点一点地建立,所以你可以看到发生了什么:
WITH
test_data (text)
AS (SELECT '1234F1234F1234F1234F1234F1234F1234' FROM DUAL
)
SELECT
text
,INSTR(text,'F',1,5) --fifth occurence
,SUBSTR(text,1,INSTR(text,'F',1,5)-1) --substr up to that point
,SUBSTR(text,1,INSTR(text,'F',1,5)-1)||'P' --add P
,SUBSTR(text,1,INSTR(text,'F',1,5)-1)||'P'||SUBSTR(text,INSTR(text,'F',1,5)+1) --add remainder of string
FROM
test_data
;
所以你要做的就是
UPDATE <your table>
SET <your column> = SUBSTR(<your column>,1,INSTR(<your column>,'F',1,5)-1)||'P'||SUBSTR(<your column>,INSTR(<your column>,'F',1,5)+1)
..假设您要更新所有行
答案 2 :(得分:0)
下面的解决方案在输入字符串的开头查找前五个字符。如果找到,则保持前四个不变,并用字母P替换第五个。注意,如果输入字符串是四个字符或更少,则保持不变。 (这包括with
test_data ( str ) as (
select 'ABCDEFGH' from dual union all
select 'PPPPF' from dual union all
select 'PPPPP' from dual union all
select '1234' from dual union all
select null from dual
)
select str, regexp_replace(str, '^(.{4}).', '\1P') as replaced
from test_data
;
STR REPLACED
-------- --------
ABCDEFGH ABCDPFGH
PPPPF PPPPP
PPPPP PPPPP
1234 1234
5 rows selected.
作为输入字符串,显示在创建示例字符串的WITH子句中以及输出中 - 请注意输出有五行,即使最后一行中没有任何内容可见。)
dict
答案 3 :(得分:0)
将第5个'位'翻转为'P',它当前为'F'。
update table
set column = regexp_replace(column , '^(.{4}).', '\1P')
where regexp_like(column , '^.{4}F');