Hello I’ve got a question, how (if it possible), I can create new datatables with close same rows but if In column value is in string “/” for example
ID | column_param | column_sym | column_value | column_val2 |
---|---|---|---|---|
First | param_test1 | ABC | 11/12 | test |
Second | param_test2 | CDE | 22/11 | test |
Third | param_test3 | EFG | 44 | teste |
4’th | param_test4 | HIJ | 33/22 | test |
And here if I have param_test1
and param_test4
and if in this column value has “/” I want to create 2 other rows but if I will not set param_test2
then it stay as it is and everything should be in new datatable. Is any way to create this?
Thank you in advance.
Expected result:
Advertisement
Answer
- As per Gordon’s answer, I’m not sure what should be done with the your ID column. I’ve replaced these with row numbers.
- Depending on your version of MySQL/MariaDB, the
ROW_NUMBER()
window function may not be available. Depending on whether IDs in the output are necessary you may be able to simply omit this. - I’ve assumed the existence of a table called
myNumbers
which contains a single fieldnum
and is populated with positive integers from 1 to whatever you’re likely to need.
I’ve included more in the output that you asked for, which will hopefully help you understand what’s going on
SELECT ROW_NUMBER() OVER (ORDER BY d.ID, n.num) as NewID, d.ID as OriginalID, n.num as, d.column_param, d.column_sym, d.column_value as orig_value, CASE WHEN column_param = 'param_test2' THEN d.column_value ELSE substring_index(substring_index(d.column_value,'/',n.num),'/',-1) END as split_value, d.column_val2 FROM myData d JOIN myNumbers n on char_length(d.column_value)-char_length(replace(d.column_value,'/','')) >= n.num-1 WHERE n.num = 1 OR d.column_param <> 'param_test2' ORDER BY d.ID, n.num
See this DB Fiddle (the columns output in a different order than I’ve specified, but I think that’s a DB Fiddle quirk).
If you only want to “split” say param_test1
and param_test4
rows the code above code could be amended as follows:
SELECT ROW_NUMBER() OVER (ORDER BY d.ID, n.num) as NewID, d.ID as OriginalID, d.column_param, d.column_sym, n.num, d.column_value as orig_value, CASE WHEN column_param NOT IN ('param_test1','param_test4') THEN d.column_value ELSE substring_index(substring_index(d.column_value,'/',n.num),'/',-1) END as split_value, d.column_val2 FROM myData d JOIN myNumbers n on char_length(d.column_value)-char_length(replace(d.column_value,'/','')) >= n.num-1 WHERE n.num = 1 OR d.column_param IN ('param_test1','param_test4') ORDER BY d.ID, n.num