Is it possible to split a word into separate lines? All the examples I found were using something to refer to as a comma or something, but I would like to separate each letter from a word, eg:
from (my table):
| id | name |
|---|---|
| 1 | banana |
to: SELECT ...
| id | letter |
|---|---|
| 1 | b |
| 1 | a |
| 1 | n |
| 1 | a |
| 1 | n |
| 1 | a |
CodePudding user response:
One option is doing it with a recursive query, using the following two steps:
- base step: get the letter in position 1
- recursive step: get nth letter, using
LEFT(RIGHT(1), n), which extracts the letter in position n.
Recursion is halted when the nth extracting element is higher than then length of the string.
WITH RECURSIVE cte AS (
SELECT id, name,
1 AS idx,
RIGHT(LEFT(name, 1),1) AS letter
FROM tab
UNION ALL
SELECT id, name,
idx 1 AS idx,
RIGHT(LEFT(name, idx 1), 1) AS letter
FROM cte
WHERE idx < LENGTH(name)
)
SELECT id, letter FROM cte
Output:
| id | letter |
|---|---|
| 1 | b |
| 1 | a |
| 1 | n |
| 1 | a |
| 1 | n |
| 1 | a |
Check the demo here.
CodePudding user response:
A simple way would be to join with a numbers table:
with n as (
select * from (values row(1),row(2),row(3),row(4),row(5),row(6),row(7),row(8),row(9))x(num)
)
select t.id, Substring(name, n.num, 1)
from t
join n on n.num <= Length(t.name);
CodePudding user response:
An other way more performant is by using REGEXP_REPLACE, json_array and json_table
REGEXP_REPLACE to convert banana to b,n,a,n,a
json_array to create a json array from b,n,a,n,a
json_table will convert JSON data to tabular data.
with cte as (
select id, REGEXP_REPLACE(name, "(.)(?!$)", "$1,") as name
from _table
)
select cte.id, t.name
from cte
join json_table(
replace(json_array(cte.name), ',', '","'),
'$[*]' columns (name varchar(50) path '$')
) t;
