String 使用instr查找精确匹配的Pl/Sql
我试图找出一个单词中是否存在字符串并将其提取出来。我使用了instr函数,但它的作用与函数类似:如果部分或整个单词存在,它将返回它 这里我想把字符串“Services”去掉,它可以工作,但是如果我把“Services”改为“Service”,它仍然可以工作。我不想那样。如果输入“服务”,则应返回null,而不是“服务” 修改: 我在这里试图做的是缩写公司名称的某些部分 这就是我的数据库表的外观:String 使用instr查找精确匹配的Pl/Sql,string,oracle,plsql,extract,substr,String,Oracle,Plsql,Extract,Substr,我试图找出一个单词中是否存在字符串并将其提取出来。我使用了instr函数,但它的作用与函数类似:如果部分或整个单词存在,它将返回它 这里我想把字符串“Services”去掉,它可以工作,但是如果我把“Services”改为“Service”,它仍然可以工作。我不想那样。如果输入“服务”,则应返回null,而不是“服务” 修改: 我在这里试图做的是缩写公司名称的某些部分 这就是我的数据库表的外观: Word | Abb ---------+----- Company | com Li
Word | Abb
---------+-----
Company | com
Limited | ltd
Service | serv
Services | servs
代码如下:
Declare
Cursor Words Is
SELECT word,abb
FROM abbWords
processingWord VARCHAR2(50);
abbreviatedName VARCHAR(120);
fullName = 'A.D Company Services Limited';
BEGIN
FOR eachWord IN Words LOOP
--find the position of the word in name
wordPosition := INSTR(fullName, eachWord.word);
--extracts the word form the full name that matches the database
processingWord := Substr(fullName,instr(fullName,eachWord.word), length(eachWord.word));
--only process words that exist in name
if wordPosition > 0 then
abbreviatedName = replace(fullName, eachWord.word,eachWord.abb);
end if;
END lOOP;
END;
因此,如果用户输入“服务”,我不希望返回“服务”。我的意思是,如果在中找不到“Service”一词,那么单词位置应该是0,而不是返回单词“Services”的位置。返回一个数字:匹配字符串第一次出现的索引。您应该使用10g+:
SQL> select regexp_substr('A.D Company Services Limited', 'Services') match,
2 regexp_substr('A.D Company Service Limited', 'Services') unmatch
3 from dual;
MATCH UNMATCH
-------- -------
Services
一种方法是:
DECODE(INSTR('A.D Company Seervices Limited','Services'),
0,
NULL,
SUBSTR('A.D Company Services Limited',
INSTR('A.D Company Services Limited','Services'),
length('Services')))
如果找不到文本,将返回0。将计算第一个参数,与第二个参数进行比较,如果匹配,则返回第三个参数,如果不匹配,则返回第四个参数
可以说这不是最优雅的方式,但符合您的要求 我觉得你把事情复杂化了。你可以用它做任何事。例如;鉴于下表:
create table names ( name varchar2(100));
insert into names values ('A.D Company Services Limited');
insert into names values ('A.D Company Service Limited');
此查询将仅返回名称“A.D Company Services Limited”
这意味着匹配字符串^的开头,或者匹配一个空格,后跟服务,后跟字符串$的结尾,或者匹配一个空格。这就是正则表达式与使用instr等的区别。您可以根据其他因素轻松地进行匹配
然而,尽管这似乎是你的问题,我不认为这是你想要做的。您正在尝试替换较宽字符串中的字符串“serv”,而不替换“services”或“service”。为此,您需要使用
如果我将以下行添加到表中:
insert into names values ('A.D Company Serv Limited');
并运行此查询:
select regexp_replace( name
, '(^|[[:space:]])serv($|[[:space:]])'
, ' Services '
, 1, 0, 'i' )
from names
唯一会改变的是“Serv”,在这个最新的产品线中,它将被“服务”取代。注意空格;由于您不想将“服务”替换为“服务”,因此这些都非常重要
下面是一个示例。另一个替代方法是使用以下内容:
select replace(name,' serv ', ' Services ')
from names;
这将仅替换位于2个空格之间的单词“Serv”
谢谢,,
Alex.这对我不起作用。我正在做的是将word表格中的所有单词选择到一个游标中,然后我在游标中的记录中循环查找表格中存在的“a.D Company Services Limited”中的单词。因此,我正在使用instr函数查找存在于我的游标中的单词Service和Services,它同时处理服务和服务。@dev_darin:对不起,我不理解您的要求。也许你应该用每个案例的预期结果重写你的问题。
select replace(name,' serv ', ' Services ')
from names;