sql >> Database teknologi >  >> RDS >> Oracle

REGEX for at vælge den n'te værdi fra en liste, hvilket giver mulighed for nuller

Tak til dem, der har svaret. Efter at have læst dine svar og svarene i det medfølgende link nåede jeg frem til denne løsning:

SQL> select REGEXP_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1) data
  2  from dual;

Data
----

Hvilket kan beskrives som "se på den 2. forekomst af et valgfrit sæt af nul eller flere tegn, efterfulgt af et komma eller slutningen af ​​linjen, og returner den 1. undergruppe (som er data minus kommaet eller slutningen af linje).

Jeg glemte at nævne, at jeg testede med null i forskellige positioner, flere nuller, valg af forskellige positioner osv.

Den eneste advarsel, jeg kunne finde, er, at hvis feltet du leder efter er større end det tilgængelige antal, returnerer det bare NULL, så du skal være opmærksom på det. Ikke et problem for mit tilfælde.

EDIT:Jeg opdaterer det accepterede svar til gavn for fremtidige søgere, der kan falde over dette.

Det næste trin er at indkapsle koden, så den kan gøres til en enklere, genbrugelig funktion. Her er funktionskilden:

  FUNCTION  GET_LIST_ELEMENT(string_in VARCHAR2, element_in NUMBER, delimiter_in VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
    BEGIN
      RETURN REGEXP_SUBSTR(string_in, '(.*?)(\'||delimiter_in||'|$)', 1, element_in, NULL, 1);
  END GET_LIST_ELEMENT;

Dette skjuler regex-kompleksiteten for udviklere, som måske ikke er så komfortable med det, og gør koden renere alligevel, når den er i brug. Kald det sådan her for at få det 4. element:

select get_list_element('123,222,,432,555', 4) from dual;


  1. SQLAlchemy ingen adgangskode angivet fejl

  2. PSQLEundtagelse:FEJL:Relationen TABLE_NAME eksisterer ikke

  3. Fuldt administreret PostgreSQL-hosting på AWS og Azure lanceres i tide til ældre migreringer

  4. Hvad er @@MAX_PRECISION i SQL Server?