sql >> Databasteknik >  >> RDS >> Oracle

Hur man hämtar den multipla matchningssträngen med ett reguljärt uttryck

Om du vill ha alla dessa som en enda sträng i en rad dem finns det inget behov av att använda reguljära uttryck du kan använda en standard REPLACE() :

SQL> select replace('2711393|2711441|1234567', '|', ', ') from dual;

REPLACE('2711393|2711441|
-------------------------
2711393, 2711441, 1234567

Om du vill ha alla dessa i en enda kolumn måste du använda CONNECT BY som jag visar här . Observera att detta är mycket ineffektivt.

SQL>  select regexp_substr('2711393|2711441|1234567', '[^|]+', 1, level)
  2     from dual
  3  connect by regexp_substr('2711393|2711441|1234567'
  4                           , '[^|]+', 1, level) is not null;

REGEXP_SUBSTR('2711393|2711441|1234567','[^|]+',1,LEVEL)
--------------------------------------------------------------------------

2711393
2711441
1234567

SQL>

Om du vill ha dessa i olika kolumner måste du använda PIVOT och du måste veta hur många du har. Jag antar 3.

SQL> select *
  2    from (
  3   select regexp_substr('2711393|2711441|1234567', '[^|]+', 1, level) as a
  4        , level as lvl
  5     from dual
  6  connect by regexp_substr('2711393|2711441|1234567'
  7                           , '[^|]+', 1, level) is not null
  8          )
  9   pivot ( max(a)
 10          for lvl in (1,2,3)
 11          )
 12         ;

1          2          3
---------- ---------- ----------
2711393    2711441    1234567

SQL>

Som du kan se är dessa alla helt hemska och, förutom den första, mycket ineffektiva. Du bör normalisera din databas korrekt för att säkerställa att du inte behöver göra detta.




  1. Hur upptäcker man om en sträng innehåller specialtecken?

  2. MySQL - Konvertera MM/DD/YY till Unix tidsstämpel

  3. NodeJS MySQL Dump

  4. MySQL CURRENT_TIMESTAMP vid skapande och vid uppdatering