Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用instr查找精确匹配的Pl/Sql_String_Oracle_Plsql_Extract_Substr - Fatal编程技术网

String 使用instr查找精确匹配的Pl/Sql

String 使用instr查找精确匹配的Pl/Sql,string,oracle,plsql,extract,substr,String,Oracle,Plsql,Extract,Substr,我试图找出一个单词中是否存在字符串并将其提取出来。我使用了instr函数,但它的作用与函数类似:如果部分或整个单词存在,它将返回它 这里我想把字符串“Services”去掉,它可以工作,但是如果我把“Services”改为“Service”,它仍然可以工作。我不想那样。如果输入“服务”,则应返回null,而不是“服务” 修改: 我在这里试图做的是缩写公司名称的某些部分 这就是我的数据库表的外观: Word | Abb ---------+----- Company | com Li

我试图找出一个单词中是否存在字符串并将其提取出来。我使用了instr函数,但它的作用与函数类似:如果部分或整个单词存在,它将返回它

这里我想把字符串“Services”去掉,它可以工作,但是如果我把“Services”改为“Service”,它仍然可以工作。我不想那样。如果输入“服务”,则应返回null,而不是“服务”

修改:

我在这里试图做的是缩写公司名称的某些部分

这就是我的数据库表的外观:

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;