How to convert column with delimited string into rows

I have a string value in a single column, delimited by colon. The number of items in the string is variable. I need to select the data from this column into separate rows based on the delimiter. I can write a function with a loop but if there is a way to do this in SQL it would be better.
Table contains a column with data value:
12:130:1400
And I want to select data and return as:
12
130
1400
This in in Oracle 9i.
Please don't post "look for pivot or transpose in the forum" as that is not a helpful answer (I have already done that).
Thanks!
Message was edited by:
splinternet

SQL> create table mytable (id,value)
  2  as
  3  select 1, '12:130:1400' from dual union all
  4  select 2, '483' from dual union all
  5  select 3, '1:2:3:4:5:6:77:888' from dual union all
  6  select 4, null from dual
  7  /
Tabel is aangemaakt.
SQL> select id
  2       , trim(':' from v) value
  3       , substr
  4         ( v
  5         , instr(v,':',1,t.column_value) + 1
  6         , instr(v,':',1,1 + t.column_value)
  7           - instr(v,':',1,t.column_value) - 1
  8         ) part
  9    from ( select id, ':' || value || ':' v from mytable ) m
10       , table
11         ( cast
12           ( multiset
13             ( select level l
14                 from dual
15              connect by rownum <= length(m.v) - length(replace(m.v,':')) - 1
16             )
17           as sys.dbms_debug_vc2coll
18           )
19         ) t
20   order by m.id
21       , t.column_value
22  /
        ID VALUE                PART
         1 12:130:1400          12
         1 12:130:1400          130
         1 12:130:1400          1400
         2 483                  483
         3 1:2:3:4:5:6:77:888   1
         3 1:2:3:4:5:6:77:888   2
         3 1:2:3:4:5:6:77:888   3
         3 1:2:3:4:5:6:77:888   4
         3 1:2:3:4:5:6:77:888   5
         3 1:2:3:4:5:6:77:888   6
         3 1:2:3:4:5:6:77:888   77
         3 1:2:3:4:5:6:77:888   888
         4
13 rijen zijn geselecteerd.Regards,
Rob.

Similar Messages

  • Parse column with csv string into table with one row per item

    I have a table (which has less than 100 rows) - ifs_tables that has two columns: localtable and Fields. Localtable is a table name and Fields contains a subset of columns from that table. Fields is a comma delimited list:  'Fname,Lname'. It looks like
    this:
    localtable         fields
    =========  =============
    customertable   fname,lname
    accounttable     type,accountnumber
    Want to end up with a new table that has one row per column. It should look like this:
    TableName             ColumnName
    ============ ==========
    CustomerTable        Fname
    CustomerTable        Lname
    AccountTable          Type
    AccountTable          AccountNumber
    Tried this code but have two issues (1) My query using the Splitfields functions gets "Subquery returned more than 1 value" (2) some of my Fields has hundreds of collumns in the commas delimited list. It will returns "Msg 530, Level 16, State
    1, Line 8. The statement terminated. The maximum recursion 100 has been exhausted before statement completion.maxrecursion greater than 100." Tried adding OPTION (maxrecursion 0) in the Split function on the SELECT statment that calls the CTE, but
    the syntax is not correct.
    Can someone help me to get this sorted out? Thanks
    DROP FUNCTION [dbo].[SplitFields]
    go
    CREATE FUNCTION [dbo].[SplitFields]
    @String NVARCHAR(4000),
    @Delimiter NCHAR(1)
    RETURNS TABLE
    AS
    RETURN
    WITH Split(stpos,endpos)
    AS(
    SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
    UNION ALL
    SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
    FROM Split
    WHERE endpos > 0
    SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
    'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
    FROM Split --OPTION ( maxrecursion 0);
    GO
    IF OBJECT_ID('tempdb..#ifs_tables') IS NOT NULL DROP TABLE #ifs_tables
    SELECT *
    INTO #ifs_tables
    FROM (
    SELECT 'CustomerTable' , 'Lname,Fname' UNION ALL
    SELECT 'AccountTable' , 'Type,AccountNumber'
    ) d (dLocalTable,dFields)
    IF OBJECT_ID('tempdb..#tempFieldsCheck') IS NOT NULL DROP TABLE #tempFieldsCheck
    SELECT * INTO #tempFieldsCheck
    FROM
    ( --SELECT dLocaltable, dFields from #ifs_tables
    SELECT dLocaltable, (SELECT [Data] FROM dbo.SplitFields(dFields, ',') ) from #ifs_tables
    ) t (tLocalTable, tfields) -- as Data FROM #ifs_tables
    SELECT * FROM #tempFieldsCheck

    Try this
    DECLARE @DemoTable table
    localtable char(100),
    fields varchar(200)
    INSERT INTO @DemoTable values('customertable','fname,lname')
    INSERT INTO @DemoTable values('accounttable','type,accountnumber')
    select * from @DemoTable
    SELECT A.localtable ,
    Split.a.value('.', 'VARCHAR(100)') AS Dept
    FROM (SELECT localtable,
    CAST ('<M>' + REPLACE(fields, ',', '</M><M>') + '</M>' AS XML) AS String
    FROM @DemoTable) AS A CROSS APPLY String.nodes ('/M') AS Split(a);
    Refer:-https://sqlpowershell.wordpress.com/2015/01/09/sql-split-delimited-columns-using-xml-or-udf-function/
    CREATE FUNCTION ParseValues
    (@String varchar(8000), @Delimiter varchar(10) )
    RETURNS @RESULTS TABLE (ID int identity(1,1), Val varchar(8000))
    AS
    BEGIN
    DECLARE @Value varchar(100)
    WHILE @String is not null
    BEGIN
    SELECT @Value=CASE WHEN PATINDEX('%'+@Delimiter+'%',@String) >0 THEN LEFT(@String,PATINDEX('%'+@Delimiter+'%',@String)-1) ELSE @String END, @String=CASE WHEN PATINDEX('%'+@Delimiter+'%',@String) >0 THEN SUBSTRING(@String,PATINDEX('%'+@Delimiter+'%',@String)+LEN(@Delimiter),LEN(@String)) ELSE NULL END
    INSERT INTO @RESULTS (Val)
    SELECT @Value
    END
    RETURN
    END
    SELECT localtable ,f.Val
    FROM @DemoTable t
    CROSS APPLY dbo.ParseValues(t.fields,',')f
    --Prashanth

  • How to convert server specific date string into client specific date object

    Hi developers,
    I have a very complex issue to convert the server date string format "EEE MMM dd HH:mm:ss z yyyy" into java.util.Date object and find the difference of the client machine date to represent the elapsed time
    The problem is the server time zone and client time zone are not unique and when I try to covert the server date which is in string format to date format using SimpleDateFormat class , I got the server time as 3:30 hours appended to it. The server time zone is in IST and Client time zone format is GMT+5:30 , the appended time of 3:30 hours created the confusion in calculating the elapsed time between the server started time and client requested time
    I went through all the sites but none of them were useful
    If any help to solve the above issue is appriciated
    please send the response with the same subject line
    Advance Thanks

    Why don't you just subtract from the server time the 3:30 hours (consult api of java.util.date) before comparing with the client date? Hard to see where's the problem...

  • Pipe delimiter  string into rows using regular expression

    hi Can anyone please help writing pipe' l 'delimiter values to rows
    sample data 'something1|something2|something3'
    i tried with below query
    SELECT LEVEL,
    TRIM ('"' FROM RTRIM (REGEXP_SUBSTR ('something1|something2|something3' || '|',
    '".*?"||[^|]*|',
    1,
    LEVEL
    '|'
    ) sub_str
    FROM dual
    CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE ('something1|something2|something3' , '".*?"|[^|]*')) + 1

    SQL> ed
    Wrote file afiedt.buf
      1  with t as (select 'something1|something2|something3' as txt from dual)
      2  -- end of sample data
      3  select REGEXP_SUBSTR (txt, '[^|]+', 1, level)
      4  from t
      5* connect by level <= length(regexp_replace(txt,'[^|]*'))+1
    SQL> /
    REGEXP_SUBSTR(TXT,'[^|]+',1,LEVE
    something1
    something2
    something3
    SQL>

  • How to split a delimited string into rows

    Hi Everyone,
    I have a field in my EMPLOYEE table named "OLD_USER_IDS" which stores all the old system ID's that the employee was once assigned to. This field is comma separated like so: "USERID1,USERID2,USERID3". My question is: how can I write a SELECT query that splits each individual User ID into its own row?
    For example:
    EMP_ID USER_ID
    10 USERID1
    10 USERID2
    12 USERID3
    15 USERID4
    15 USERID5
    15 USERID6
    Thank You
    -Sam

    I think you should search this forum first for similar questions. I keep track of some interesting stuffs posted in this forum in a file, and from that
    WITH t AS  (SELECT 'USER1,USER2,USER3' str FROM DUAL
    select substr(str,
                        decode(level,
                               1,
                               1,
                               instr(str, ',', 1, level - 1) + 1),
                        decode(instr(str, ',', 1, level),
                               0,
                               length(str),
                               instr(str, ',', 1, level) -
                               decode(level,
                                      1,
                                      0,
                                      instr(str, ',', 1, level - 1)) - 1)) the_value
            from (select str from t)
          connect by level <=
                     length(str) - length(replace(str, ',')) + 1;

  • How to Convert the Stream of strings into ArrayList Integer

    I have a String st = "12 54 456 76ASD 243 646"
    what I want to do is print it like this from the ArrayList<Integer>:
    12
    54
    456
    243
    646
    It should catch the "76ASD" exception as it contain String Character.
    This is how I am doing, which it seems to work but when it reaches the 76ASD it catches the exception so it is not adding the rest to the Arraylist, therefore I could not print in sequence.
      public static void main(String[] args) {
            // TODO code application logic here
            getDatas(testString);
            for (int i = 0; i < at.size(); ++i) {
                System.out.println(at.get(i));
        private static ArrayList<Integer> getDatas(String aString) {
            StringTokenizer st = new StringTokenizer(aString);
            try {
                while (st.hasMoreTokens()) {
                    String sts = "";
                    sts = st.nextToken();
                    at.add(Integer.parseInt(sts));
            } catch (Exception e) {
                System.out.println("Error: " + e);
            return at;
        }Please guide me where I am going
    Thanks

    paulcw wrote:
    This is one of the few cases where I'd say catching an exception as part of the design is acceptable. When parsing, either something parses, or it doesn't. Using parseInt, we're parsing the string and using the result of the parse. By using a regular expression, we're parsing it twice, in two different ways, which may get out of sync. Not only that, if you have a more complicated case, like negative numbers and decimals, the regex gets really ugly.
    I agree this is exactly the case where it is appropriate to try, catch, handle, move on. I sometimes wish there were an Integer.isValid(String) method, but even if there were, we'd call it, and if it returned true, we'd then call parseInt anyway, which would repeat the same work that isValid did. All it would buy us would be an if test instead of a try/catch.

  • Convert an array of strings into a single string

    Hi
    I am having trouble trying to figure out how to convert an array of strings into a single string.
    I am taking serial data via serial read in a loop to improve data transfer.  This means I am taking the data in chunks and these chunks are being dumped into an array.  However I want to combine all elements in the array into a single string (should be easy but I can't seem to make it work).
    In addition to this I would also like to then split the string by the comma separator so if any advice could be given on this it would be much appreciated.
    Many Thanks
    Ashley.

    Well, you don't even need to create the intermediary string array, right? This does exactly the same as CCs attachment:
    Back to your serial code:
    Why don't you built the array at the loop boundary? Same result.
    You could even built the string directly as shown here.
    Message Edited by altenbach on 12-20-2005 09:39 AM
    LabVIEW Champion . Do more with less code and in less time .
    Attachments:
    autoindexing.png ‏5 KB
    concatenate.png ‏5 KB
    StringToU32Array.png ‏3 KB

  • How to convert Oracle reports previewer output into delimited file.

    How to convert Oracle reports previewer output into delimited file if the report has more than 1000 pages.
    I tried with previewer option File --> Generate to file --> Delimited file, but the report engine is crashing.Not generating .TXT file.
    I observed that this option is not working for more than 400 pages.
    I am using Oracle reports 6i version.
    Plz suggest me to generate .TXT file from Report previewer.

    You can specify a delimiter (a character or string of characters) to separate the data (boilerplate or field objects) in your report output in either of the following ways:
    On the command line using the DELIMITER keyword.
    In the Delimited Output dialog box or DelimitedData Output dialog box (displayed with File > Generate to File > Delimited or File > Generate to File > DelimitedData) in Reports Builder.
    for further information goto this link
    http://download.oracle.com/docs/cd/B14099_17/bi.1012/b13895/orbr_concepts2.htm#sthref760

  • How to convert columns into rows using  transpose function

    Hi
    anybody tell me how to convert columns values into rows using transpose function.

    Since BluShadow went to all the trouble to put it together, someone should use it.
    See the post titled How do I convert rows to columns? here SQL and PL/SQL FAQ
    John

  • How to read and write a string into a txt.file

    Hi, I am now using BEA Workshop for Weblogic Platform version10. I am using J2EE is my programming language. The problem I encounter is as the above title; how to read and write a string into a txt.file with a specific root directory? Do you have any sample codes to reference?
    I hope someone can answer my question as soon as possible
    Thank you very much.

    Accessing the file system directly from a web app is a bad idea for several reasons. See http://weblogs.java.net/blog/simongbrown/archive/2003/10/file_access_in.html for a great discussion of the topic.
    On Weblogic there seems to be two ways to access files. First, use a File T3 connector from the console. Second, use java.net.URL with the file: protocol. The T3File object has been deprecated and suggests:
    Deprecated in WebLogic Server 6.1. Use java.net.URL.openConnection() instead.
    Edited by: m0smith on Mar 12, 2008 5:18 PM

  • How to convert JSR-168 compliant Portlets into SAP iviews

    Hi All,
    Its very urgent requirement for me...
    <b>How to convert JSR-168 compliant Portlets into SAP Enterprise Portal supported iViews in SAP NetWeaver 2004 or 2004s.</b> Can you please tell me any tools are available for conversion or is there any another procedure to achieve this problem.
    At last can we ach
    Each answer will be awarded with points.
    Regards
    Sreedhar G

    Hi Sreedhar,
    Is there anyway to display Standard Business packages content in IBM websphere portal.If there is anyway please let me know.
    thanks,
    Anil

  • How to convert 1D array of string to string

    How to convert 1D array of string to string.

    Maximus00, as Pavel indicated, there is a lesser known feature of "Concatenate Strings" that does exactly what your code is doing if the input is an array of strings. In one step! See attached image.
    LabVIEW Champion . Do more with less code and in less time .
    Attachments:
    ConcatenateArray ofStrings.gif ‏7 KB

  • Converting comma separated string into rows

    for my procedure  varchar2 is i/p paramter. i will get this i/p from java. this string value is like  'VTP,VR','VM'.
    i want to split taht string into rows  ie o/p will be
    VTR
    VR
    VM.
    how to do this.

    Hi,
    As always, the solution depends on your data, your requirements, and you Oracle version.
    Here's one way:
    -- Simulating Java input with a bind variable:
    VARIABLE  str VARCHAR2 (100)
    EXEC     :str := 'VTP,VR,VM';
    SELECT  LEVEL  AS n
    ,       REGEXP_SUBSTR ( :str
                          , '[^,]+'
                          , 1
                          , LEVEL
                          ) AS str_part
    FROM     dual
    CONNECT BY LEVEL <= 1 + REGEXP_COUNT (:str, ',')
    I'm just guessing that your original string doesn't include single-quotes after VR or before VM.  If it does, you can use TRIM to remove them from the string passed back by REGEXP_SUBSTR.

  • How to convert from military time (string) to regular time?

    How to convert from military time (string) to regular time?
    First of all I need to let you know I'm very new to Crystal Reports, so I apologize and will need detailed instructions if possible.
    I have created a Crystal Report pulling information from the received time field.  On the report, the time is showing in military time (ex. 16:00:00).
    How can I convert this time to normal time (ex. 4:00:00)
    Since the field is a 'String' field and not a 'Time' field, I do not have the option of changing it under the field properties.
    I hope someone can help with this.
    Thank you in advance.

    As my fields were date only and not datetime, I ended up using the following,
    If IsDate({CallLog.EmailRecdDate}) Then
         CDate({CallLog.EmailRecdDate})
    Else
         CDate(0,0,0)
    You answer lead me in the right direction.
    I'm still having an issue with the 'Else' statment returning 12:00:00 because of the CDate(0,0,0), but I'm not sure what else I can use to return a blank space on the report.  Any ideas?
    Thanks again!

  • Hi, can anyone guide me how to convert Freehand MX for PC into Mac Version?

    Hi, can anyone guide me how to convert Freehand MX for PC into Mac Version?

    You can upgrade to Mavericks free, just run the App Store program and search for Mavericks. But before you do upgrade I recommend the following:
    1) make sure you have a recent backup. TimeMachine is fine.
    2) Mavericks is somewhat more memory hungry than 10.7 was. You will need 4 GB of RAM and I strongly recommend 8 GB.
    Go back to the Apple menu and select About this Mac - look under the OS info you just looked at. You'll see how much RAM your computer has now. Then click on the More Info button. There you will see your computer info listed as in: iMac, 21.5" mid 2010, for example. Return back with that information and we can tell you how far the computer can be upgraded.
    If you decide to procede and you have enough RAM upgrading to Mavericks is quite simple. Click on the download button and let it do its job.

Maybe you are looking for

  • Can you add Programs to Open With Menu

    Is there a way to add programs to the Open With Menu.  For example, when you right click on a file you can choose to open it with the default application by selecting Open, or choose other programs to open it with by selecting Open With.  Only a few

  • PDF itext

    Hi All I am using SWT. For Printing i am exporting all the values to pdf and then make printing. So far i have placed my pdf in some location using FileOutptStream and the open it using Executable ex = new Executable(); ex.openDocument(strFilePath);

  • Copy array and sort the numbers in the new array

    Hi! I have an array containing some digits where some of the digits are zeros. I want to copy the digits to another array but the zeros (well, I actually want to copy the zeros as well but I want to have them in the end of the new array). I suppose I

  • Report opening error

    Dear SDN's, When opening one of the BI Statistics report it going into Dump.Report opening perfectly in Development,it giving dump when opening in Quality and Production. After opening several times the report opening correctly.Please give the possib

  • Does Data Modeler 3.3 Early Adopter (3.3.0.734) work with jre 7u11  ?

    I have got the impression, DataModeler 3.3 is still not working with Java 1.7.0_11, still requiring 1.6 Are we caught in Java revision hell ? actually I'm talking about : DataModeler 64bit Rev. 3.3 early adaptor Windows7 64bit sp1 Java 7u11 64bit Edi