sql >> Databáze >  >> RDS >> Oracle

Jak načíst vícenásobný shodný řetězec pomocí regulárního výrazu

Pokud je chcete všechny jako jeden řetězec v řádku není třeba používat regulární výrazy, můžete použít standardní REPLACE() :

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

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

Pokud chcete všechny tyto položky v jednom sloupci, musíte použít CONNECT BY jak demonstruji zde . Upozorňujeme, že je to vysoce neefektivní.

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>

Pokud je chcete v různých sloupcích, musíte použít PIVOT a budete muset vědět, kolik jich máte. Předpokládám 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>

Jak vidíte, všechny jsou naprosto příšerné a kromě prvního vysoce neefektivní. Měli byste správně normalizovat svou databázi, abyste se ujistili, že to nemusíte dělat.




  1. Skryté vlastnosti PostgreSQL

  2. Lze MySQL FIND_IN_SET nebo ekvivalent nastavit tak, aby používal indexy?

  3. Přístup k datům z Raspberry Pi

  4. MySQL Select JOIN 3 Tables