sql >> Database >  >> RDS >> Oracle

SQL REGEXP_SUBSTR retourneert null String bij het splitsen

Gebruik gewoon REPLACE en je standaardcode met ,

SqlFiddleDemo

 with temp as
(
    select 108 Name, 'test' Project, 'Err1:::Err2:::Err3' Error  from dual
    union all
    select 109, 'test2', 'Err1' from dual
)
select distinct
  t.name, t.project,
  trim(regexp_substr(REPLACE(t.error, ':::', ', '), '[^,]+', 1, levels.column_value))  as error
from 
  temp t,
  table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(REPLACE(t.error, ':::', ', '), '[^,]+'))  + 1) as sys.OdciNumberList)) levels
order by name

Of je moet delen door de lengte van het scheidingsteken:

SqlFiddle

with temp as
(
    select 108 Name, 'test' Project, 'Err1:::Err2:::Err3' Error  from dual
    union all
    select 109, 'test2', 'Err1:::Err2' from dual
)
select distinct
  t.name, t.project,
  trim(regexp_substr(t.error, '[^:::]+', 1, levels.column_value))  as error
from 
  temp t,
  table(cast(multiset(select level from dual connect by  level <= length (
       regexp_replace(t.error, '[^:::]+'))/3  + 1) as sys.OdciNumberList)) levels
order by name

U kunt zien waarom het uitvoeren van:

SELECT length (regexp_replace('Err1:::Err2:::Err3', '[^:::]+')) + 1 AS l
FROM dual

Dit levert 7 op en je:

SELECT DISTINCT  t.name, t.project,
trim(regexp_substr(t.error, '[^:::]+', 1, levels.column_value))  as error

zal proberen om regexp_substr . te krijgen voor 7 gevallen waarvan 4 NULL . zullen zijn en uiteindelijk 4 NULL wordt geplet tot één NULL door DISTINCT .




  1. Waar u op moet letten als uw PostgreSQL-replicatie achterblijft

  2. Is er een ingebouwde functie die getallen kan omzetten in woorden in de sql-server?

  3. Hoe u identiteitskolomwaarden kunt krijgen zonder de naam van de identiteitskolom te vermelden in Select - SQL Server / T-SQL-zelfstudie, deel 46

  4. Wat is het verschil tussen AS en IS in een opgeslagen procedure van Oracle?