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

Sådan hentes den multiple match-streng ved hjælp af et regulært udtryk

Hvis du vil have alle disse som en enkelt streng i en række dem er der ingen grund til at bruge regulære udtryk, du kan bruge en standard REPLACE() :

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

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

Hvis du vil have alle disse i en enkelt kolonne, skal du bruge CONNECT BY som jeg demonstrerer her . Bemærk venligst, at dette er meget 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>

Hvis du vil have disse i forskellige kolonner, skal du bruge PIVOT og du skal vide, hvor mange du har. Jeg går ud fra 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, er disse alle fuldstændig forfærdelige og, bortset fra den første, meget ineffektive. Du bør normalisere din database korrekt for at sikre, at du ikke behøver at gøre dette.




  1. Dvale genererer to forskellige sekvens-id'er til PostgreSQL-indsættelse

  2. Logon-triggere i SQL Server

  3. Ukendt kolonne i 'feltliste', men kolonne findes

  4. Hvordan ændres MySQL-datamappe?