该列有一个不统一的数据,有些在末尾有“.txt”。将其中一个条目视为“ABCDEFG.TXT”我想让我的select语句返回“ABCDEFG”。
with demo (text) as
( select 'ABCDEFG.TXT' from dual union all
select 'HIJKL' from dual )
select text
, regexp_replace(text, '\.TXT$')
from demo;
TEXT REGEXP_REPLACE(TEXT,'\.TXT$')
------------ --------------------------------------------
ABCDEFG.TXT ABCDEFG
HIJKL HIJKL
或者,如果您需要它不区分大小写:
with demo (text) as
( select 'ABCDEFG.TXT' from dual union all
select 'abcdefg.txt' from dual union all
select 'HIJKL' from dual )
select text
, regexp_replace(text, '\.TXT$', '', 1, 1, 'i') as replaced
from demo;
TEXT REPLACED
------------ --------------------------------------------
ABCDEFG.TXT ABCDEFG
abcdefg.txt abcdefg
HIJKL HIJKL
或者删除任何三个字符的文件扩展名:
regexp_replace(text, '\....$', '', 1, 1, 'i')
或者去除任何长度的任何扩展:
regexp_replace(text, '\.[^.]*$', '', 1, 1, 'i')
以下查询将有所帮助
DECLARE @Var NVARCHAR(50)
SET @Var = 'ABCDASDFASF.txt'
SELECT LEFT(@Var, CHARINDEX('.', @Var)-1) 'Filename'
输出:
Filename
--------------------------------------------------
ABCDASDFASF
(1 row(s) affected)
解:
select
case
when upper(file_name) like '%.TXT' then substr(file_name, 1, (length(file_name) - 4))
else file_name
end cleaned_file_name
from
file_names;
测试:
create table file_names
(
file_name varchar2(30)
);
insert into file_names (file_name) values ('ABCDEFG');
insert into file_names (file_name) values ('ABCDEFG.TXT');
insert into file_names (file_name) values ('ABCDEFGTXT');
insert into file_names (file_name) values ('ABCD.TXT.EFG');
insert into file_names (file_name) values ('abcdefg.txt');
insert into file_names (file_name) values ('ABCDEFG.DOC');
select
case
when upper(file_name) like '%.TXT' then substr(file_name, 1, (length(file_name) - 4))
else file_name
end cleaned_file_name
from
file_names;
CLEANED_FILE_NAME
--------------------------------------------------------------------------------
ABCDEFG
ABCDEFG
ABCDEFGTXT
ABCD.TXT.EFG
abcdefg
ABCDEFG.DOC
6 rows selected.
你可以使用SUBSTR
和INSTR
的组合,它比REGEXP_
函数更有效。
即使您的文本中有多个点"."
,这也有效。它搜索最后一个点。如果您需要考虑所有类型的扩展,请搜索'.'
而不是'.TXT'
。然后你应该搜索CASE WHEN txt LIKE '%.%'
作为一般情况。
SELECT
CASE
WHEN
INSTR ( upper(txt) , '.TXT' ) > 0
THEN
SUBSTR(txt, 1, INSTR ( txt, '.' , - 1 ) - 1 )
ELSE
txt
END
modtxt
FROM
yourtable;