sql >> Databasteknik >  >> RDS >> Oracle

REGEX för att välja n:te värde från en lista, vilket tillåter nollvärden

Tack till de som svarat. Efter att ha läst igenom dina svar och svaren i länken som tillhandahålls, kom jag fram till den här lösningen:

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

Data
----

Vilket kan beskrivas som "titta på den andra förekomsten av en valfri uppsättning av noll eller fler tecken som följs av ett kommatecken eller slutet av raden, och returnera den första undergruppen (som är data minus kommatecken eller slutet av rad).

Jag glömde att nämna att jag testade med noll i olika positioner, flera nollor, val av olika positioner osv.

Den enda varningen jag kunde hitta är att om fältet du letar efter är större än antalet tillgängliga, returnerar det bara NULL så du måste vara medveten om det. Inget problem för mitt fall.

EDIT:Jag uppdaterar det accepterade svaret till förmån för framtida sökare som kan snubbla över detta.

Nästa steg är att kapsla in koden så att den kan göras till en enklare, återanvändbar funktion. Här är funktionskällan:

  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;

Detta döljer regexkomplexiteten för utvecklare som kanske inte är så bekväma med det och gör koden renare ändå när den används. Kalla det så här för att få det 4:e elementet:

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


  1. Hur man trimmar strängar i SQL

  2. Barman Cloud – Del 2:Cloud Backup

  3. Databaskorruption

  4. Guide till designdatabas för restaurangordersystem i MySQL