sql >> Database >  >> RDS >> Oracle

Hoe de tekenreeks voor meerdere overeenkomsten op te halen met behulp van een reguliere expressie

Als je deze allemaal als een enkele string in een rij . wilt het is niet nodig om reguliere expressies te gebruiken, u kunt een standaard REPLACE() :

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

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

Als u deze allemaal in één kolom wilt hebben, moet u CONNECT BY zoals ik aantoon hier . Houd er rekening mee dat dit zeer inefficiënt is.

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>

Als u deze in verschillende kolommen wilt hebben, moet u gebruiken PIVOT en je moet weten hoeveel je er hebt. Ik neem aan 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>

Zoals je kunt zien, zijn deze allemaal compleet afschuwelijk en, op de eerste na, zeer inefficiënt. U moet uw database correct normaliseren om ervoor te zorgen dat u dit niet hoeft te doen.




  1. Wat betekent het om een ​​database te "normaliseren"?

  2. Wat is er mis met deze opgeslagen procedure?

  3. Een SQL Server-database maken met Azure Data Studio

  4. selecteer alleen en alleen specifieke record in orakel