简体   繁体   English

删除给定特殊字符之前的所有字符 [Oracle SQL]

[英]Removing all characters before a given special character [Oracle SQL]

my oracle table has a column with these data:我的 oracle 表有一列包含这些数据:

ROW_ID ROW_ID FILE_NAME文件名
1 1 ZASWEFFT%Contract V1.pdf ZASWEFFT%Contract V1.pdf
2 2 ZZZZxxxx12%Contract 03.12.14.pdf ZZZZxxxx12%合同 03.12.14.pdf

I need to remove everything before and including the % character, which would give me:我需要删除之前的所有内容,包括 % 字符,这会给我:

ROW_ID ROW_ID FILE_NAME文件名
1 1 Contract V1.pdf合约 V1.pdf
2 2 Contract 03.12.14.pdf合同 03.12.14.pdf

I found this similar question I changed it to fit my need and the select statement works:我发现了这个类似的问题,我将其更改为适合我的需要,并且 select 语句有效:

SELECT SUBSTR(value, INSTR(value, '%')+1) invalue
  FROM (SELECT FILE_NAME value FROM SFDC.PROJECT_ATT));

result:结果:

INVALUE价值
Contract V1.pdf合约 V1.pdf
Contract 03.12.14.pdf合同 03.12.14.pdf

But I'm not able to transform this into an update statement.但我无法将其转换为更新语句。 My last try was:我最后一次尝试是:

UPDATE SIEBEL.S_PROJ_ATT T1
   SET T1.FILE_NAME =
       (SELECT SUBSTR(value,
                      INSTR(value,
                            '%') + 1) invalue
          FROM (SELECT T2.FILE_NAME value
                  FROM SIEBEL.S_PROJ_ATT T2
                 WHERE T1.ROW_ID = T2.ROW_ID))

Oracle says the syntax is rubbish: ORA-00904: "T1"."ID": invalid identifier Oracle 说语法是垃圾: ORA-00904: "T1"."ID": invalid identifier

You don't need the subqueries;您不需要子查询; you can just do:你可以这样做:

update s_proj_att
set file_name = substr(file_name, instr(file_name, '%') + 1)
where instr(file_name, '%') > 0;

The where clause stops it trying to update any file names without the *% at the start. where子句阻止它尝试更新任何开头没有*%的文件名。

db<>fiddle demo db<>小提琴演示

The question you linked to is using a subquery - or line view - to generate the value from a string literal.您链接到的问题是使用子查询 - 或行视图 - 从字符串文字生成值。 You don't need to do that here, as you already have the column value.您不需要在此处执行此操作,因为您已经拥有列值。

you made it too complicted你太复杂了

CREATE TABLE S_PROJ_ATT ( ROW_ID INTEGER, FILE_NAME VARCHAR(32) );
 INSERT INTO S_PROJ_ATT (ROW_ID, FILE_NAME) VALUES ('1', 'ZASWEFFT%Contract V1.pdf');
 INSERT INTO S_PROJ_ATT (ROW_ID, FILE_NAME) VALUES ('2', 'ZZZZxxxx12%Contract 03.12.14.pdf');
 UPDATE S_PROJ_ATT SET FILE_NAME = SUBSTR(FILE_NAME, INSTR(FILE_NAME, '%')+1)
 

2 rows affected 2 行受影响

SELECT * FROM S_PROJ_ATT
 ROW_ID | ROW_ID | FILE_NAME -----: |:-------------------- 1 |文件名 -----: |:-------- 1 | Contract V1.pdf 2 |合同 V1.pdf 2 | Contract 03.12.14.pdf合同 03.12.14.pdf

db<>fiddle here db<> 在这里摆弄

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM