sql >> Databasteknik >  >> RDS >> Oracle

Delsträng med Oracle När det finns flera matchningar?

Du kan använda en kombination av REGEXP_SUBSTR och REGEXP_COUNT för att lösa din fråga:

WITH test_data(input) AS
(
  SELECT  '1.CABLE : THERMINAL 3X2X0.25MM FPCP PLUS UNITRONIC S9C000019651' FROM DUAL UNION ALL 
  SELECT  '2.Motor Protection Relay EMR-3MPO-2S9CB1-1 (was IQ1000II / MP 3000)' FROM DUAL UNION ALL
  SELECT  '3.GREASE : BEM 41-132 3KG CARTRIDGE KLUBERPLEX S9C00019171 (Order by KG''s required)' FROM DUAL UNION ALL
  SELECT  '4.DO NOT USE CARRIER SPIDEX ZK 38 98 SH. S9C00011593 (SUPERSEDE BY S9C10204555 - WIN0020775)' FROM DUAL
)
SELECT regexp_substr(td.input, 
                     'S9C[0-9]{8}( |$)', 
                     1, 
                     GREATEST(1, regexp_count(td.input, 'S9C[0-9]{8}( |$)')))
FROM test_data td

Här är en snabb förklaring av hur det fungerar:

  1. REGEXP_COUNT räknar förekomsterna av målmönstret, så att vi kan få den sista förekomsten senare.
  2. Sätt in resultatet i GREATEST eftersom 0 är ogiltigt för REGEXP_SUBSTR parameter.
  3. Ring REGEXP_SUBSTR för att ta tag i den sista förekomsten av målsträngen.

Här är en DBFiddle som visar att den fungerar (DBFiddle )




  1. Infoga en lista<> i SQL Server-tabellen

  2. Transactionscope kastar undantag denna plattform stöder inte distribuerade transaktioner när anslutningsobjekt öppnas

  3. Be om åsikter:En sekvens för alla tabeller

  4. Hur man läser alla filer i en Oracle Directory med PL/SQL och uppdaterar en BLOB-kolumn