'SQLite string search in rows then insert string into new rows with values of the same row last column

I want to provide a query to my database that will search if a string exists in Column2(site_id) then put that string in a new table with the value of its before column in that row.

the table has only 2 columns and the site_id column may have many 5-word strings that i want.

in the bellow example i want to get all of the the spicific site id's. for example: E7089 or E7459 (i need all of them and the first word is random like E or T or etc and the four digits are chanegable)

the current first row is like this: with one ticket_id and many site_ids(i only need site ids like:g1231 or g1236 and not the addresses in the parentheses)

ticket_id             |  site_id |
sss-bb-12312312-12312 | g1231(afsdgf-sdgsdgdg), g1236(sdfsdgsdg), g3212(asdfas-dfsd), b2311(asdasd), b3213(asdfsdf)

and make it like this:

ticket_id             |  site_id |
sss-bb-12312312-12312  g1231
sss-bb-12312312-12312  g3211
sss-bb-12312312-12312  g1236
sss-bb-12312312-12312  b2311
sss-bb-12312312-12312  b3213

i can already search through the whole second column and find the 5-word site id's with regex (if u want to try:[A-Z]\d{1,4}), but i cant extract them from the row and insert each of them into a new row, my current code is like this:

drop TABLE if EXISTS test2;
CREATE TABLE if NOT EXISTS test2 (
Ticket_id varchar,
site_id varchar
);
INSERT INTO test2 
SELECT ticket_id, site_id 
FROM TEST WHERE site_id regexp '[A-Z]\d{1,4}';

but the above code will find the row that has the site_id's and insert all of the rows that will match the search and i dont want that. can someone help to convert the first one to the second? basically the current db is like this:

culumn1 | column2
ticket1 | many site ids
ticket2 | many site ids

but i want it like this:

culumn1 | column2
ticket1 | id
ticket1 | id
ticket1 | id
ticket1 | id
ticket2 | id
ticket2 | id
ticket2 | id

-the tickets do not need any change except getting copied into new rows with their assigned site_id

-there are many site_ids for each ticket(i can already find them with regex) that need to be seperated to new rows like the above mentioned.

-it needs to be done in sqlite db browser and db browser only (its assigned like that and must be done like that so unfortunately no python)



Solution 1:[1]

You need a recursive CTE to split the site_id column of the table test1 and SUBSTR() function to take the first 5 chars to insert in the table test2:

WITH cte AS (
    SELECT ticket_id, '' site_id, site_id || ',' s 
    FROM test1
    UNION ALL 
    SELECT ticket_id,
           SUBSTR(s, 0, INSTR(s, ',')),
           SUBSTR(s, INSTR(s, ',') + 1)
    FROM cte 
    WHERE s <> ''
) 
INSERT INTO test2 (ticket_id, site_id) 
SELECT ticket_id, SUBSTR(TRIM(site_id), 1, 5) 
FROM cte
WHERE site_id <> '';

See the demo.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 forpas