7
votes

Utilisez la fonction d'intrigue Oracle pour rechercher plusieurs chaînes

dans oracle / plsql, la fonction Instr renvoie l'emplacement d'une sous-chaîne dans une chaîne.

Si la sous-chaîne n'est pas trouvée, alors Instr retournera 0 .

Je souhaite rechercher plusieurs sous-chaînes dans une chaîne et renvoyer la première valeur non nulle. Ceci peut être réalisé en utilisant regexp_instr , mais je voudrais une solution non- regexp _ .

Exemple: xxx

devrait retourner 12 (l'emplacement de "parc").


0 commentaires

5 Réponses :


5
votes

Instr ne prend pas en charge RegEx Ors - vous devez définir la fonction d'instruments Appels pour chaque sous-chaîne que vous souhaitez vérifier. L'équivalent de Regexp_instr ('500 Oracle Parkway, Redwood Shores, Ca', '(Apple | rivages)') ') Code> serait:

WHERE (INSTR('500 Oracle Parkway, Redwood Shores, CA', 'Apple') > 0
      OR
      INSTR('500 Oracle Parkway, Redwood Shores, CA', 'Park') > 0
      OR
      INSTR('500 Oracle Parkway, Redwood Shores, CA', 'Shores') > 0)


0 commentaires

2
votes

Évidemment sans regexp, il n'y aura pas une solution aussi élégante, sauf si vous écrivez votre propre fonction PL / SQL qui fait le même travail. Sinon, vous devriez faire quelque chose comme ceci:

with data as (select '500 Oracle Parkway, Redwood Shores, CA' string from dual)
select nvl(min(pos),0) from
( select instr(data.string, 'Apple') pos
  union all
  select instr(data.string, 'Park') pos
  union all
  select instr(data.string, 'Shores') pos
)
where pos > 0;


4 commentaires

J'ai trouvé que ceci comme une réponse incroyable! Alors je l'ai essayé. Et j'ai examiné le spectacle de celui-ci. Il envoie la requête à Oracle de l'interprète PL / SQL - autrement dit, c'est une façon très lente de faire ce que vous essayez de faire!


@Schlump: "Envoie la requête à Oracle depuis l'interpréteur PL / SQL"?


Oui, je me suis demandé de savoir ce que cela voulait dire aussi, mais laissez-le passer. SQL de PL / SQL Je suppose.


Il doit le transmettre au moteur PL / SQL, car il ne s'agit pas d'une opération pouvant être exécutée trivialement à l'aide d'index ou de sous-chaînes simples. Si la performance est essentielle, écrivez un package avec une fonction déterministe, renvoyant la première position non-0, qui peut ensuite être utilisée dans un indice calculé.



0
votes

Vérifiez avec ci-dessous ---

select regexp_instr ('500 Oracle Parkway, Redwood Shores, CA', 'Apple|Park|Shores', 1, 1, 0, 'i') as result
from dual;


1 commentaires

L'OP a explicitement demandé une solution sans regex.



0
votes
select 
    coalesce(
        nullif(instr('500 Oracle Parkway, Redwood Shores, CA','Apple'),0),
        nullif(instr('500 Oracle Parkway, Redwood Shores, CA','Park'),0),
        nullif(instr('500 Oracle Parkway, Redwood Shores, CA','Shores'),0)
    ) as xxx
from dual

0 commentaires

0
votes

Selon moi INSTR STRT> ne donnera pas à toutes les positions du caractère dans la chaîne, utilisez donc le code ci-dessous si vous en avez besoin.

 SELECT literal,indx FROM  (SELECT substr('HelloWorld',level,1) as literal,level as indx FROM DUAL CONNECT BY LEVEL <= length('HelloWorld'))WHERE literal IN ('l','o') ORDER BY literal


0 commentaires