dans oracle / plsql, la fonction Si la sous-chaîne n'est pas trouvée, alors 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 Exemple: b> p> devrait retourner 12 (l'emplacement de "parc"). p> p> Instr code> renvoie l'emplacement d'une sous-chaîne dans une chaîne.
Instr code > retournera
0 code>. p>
regexp_instr code>, mais je voudrais une solution non-
regexp _ code>. P>
5 Réponses :
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)
É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;
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é.
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;
L'OP a explicitement demandé une solution sans regex.
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
Selon moi 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