sql >> Databasteknik >  >> RDS >> Oracle

Dela upp strängen i rader Oracle SQL

Detta borde göra susen:

SELECT DISTINCT ID, regexp_substr("Strings", '[^ ]+', 1, LEVEL)
FROM T
CONNECT BY regexp_substr("Strings", '[^ ]+', 1, LEVEL) IS NOT NULL
ORDER BY ID;

Lägg märke till hur jag använde regexp_substr i connect by-klausulen också. Detta för att hantera fallet med flera mellanslag.

Om du har en förutsägbar övre gräns för antalet objekt per rad kan det vara värt att jämföra prestandan för den rekursiva frågan ovan med en enkel CROSS JOIN :

WITH N as (SELECT LEVEL POS FROM DUAL CONNECT BY LEVEL < 10)
--                                                       ^^
--                                                 up to 10 substrings
SELECT ID, regexp_substr("Strings", '[^ ]+', 1, POS)
FROM T CROSS JOIN N
WHERE regexp_substr("Strings", '[^ ]+', 1, POS) IS NOT NULL
ORDER BY ID;

Se http://sqlfiddle.com/#!4/444e3/1 för en livedemo



  1. Skickar en varchar full av kommaavgränsade värden till en SQL Server IN-funktion

  2. MySQL-replikering med ProxySQL på WHM/cPanel-servrar:del två

  3. Transformera ODBC-data i CloverDX

  4. Hash vad? Förstå Hash Index