sql >> Databasteknik >  >> RDS >> Oracle

Oracle reguljära uttryck delad sträng från senaste förekomst

Du kan göra det utan den dubbla reversen genom att extrahera olika fångstgrupper (omgivna av runda () parentes):

WITH t ( VAL ) AS (
  SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
  SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
)
SELECT REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 1 ) AS COL4,
       REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 2 ) AS COL3,
       REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 3 ) AS COL2,
       REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 4 ) AS COL1
FROM   t

Du kan till och med göra det reguljära uttrycket mycket enklare genom att bara använda:

'^(.+)_(.+)_(.+)_(.+)$'

Den första .+ är girig så det kommer att matcha så mycket som möjligt tills det bara finns tillräckligt med av strängen kvar för minsta matchningar i den 2:a - 4:e fångstgruppen.

Du behöver dock inte reguljära uttryck :

WITH t ( VAL ) AS (
  SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
  SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
)
SELECT SUBSTR( val, 1,        pos1 - 1        ) AS col4,
       SUBSTR( val, pos1 + 1, pos2 - pos1 - 1 ) AS col3,
       SUBSTR( val, pos2 + 1, pos3 - pos2 - 1 ) AS col2,
       SUBSTR( val, pos3 + 1                  ) AS col1
FROM   (
  SELECT val,
         INSTR( val, '_', -1, 1 ) AS pos3,
         INSTR( val, '_', -1, 2 ) AS pos2,
         INSTR( val, '_', -1, 3 ) AS pos1
  FROM   t
);


  1. Finns det ett MySQL-alternativ/-funktion för att spåra historik över ändringar i poster?

  2. Hur kan jag göra en INNAN UPPDATERAD trigger med sql-server?

  3. Date returnerar null-värden efter att ha skickat in redigeringsformuläret i php

  4. Ansluter Python till en Heroku PostgreSQL DB?