Oracle SQL Get unique characters from table

I have a table with descriptions of smth. For example:

My_Table
id description
================
1 ABC
2 ABB
3 OPAC
4 APECH

I need to get all unique characters from all description columns. The result should look like this:

symbol
================
A
B
C
O
P
E
H

And it works for all languages, so as I see regexes can't help. Please help me. Thank.

+3


source to share


3 answers


with    cte (c,description_suffix) as
        (
            select  substr(description,1,1)
                   ,substr(description,2)
            from    mytable
            where   description is not null

            union all

            select  substr(description_suffix,1,1)
                   ,substr(description_suffix,2)
            from    cte
            where   description_suffix is not null
        )
select    c
         ,count(*) as cnt
from      cte
group by  c
order by  c 

      

or

with    cte(n) as
        (
            select      level 
            from        dual 
            connect by  level <= (select max(length(description)) from mytable)
        )
select  substr(t.description,c.n,1) as c
       ,count(*)                    as cnt
from            mytable t
        join    cte c
        on      c.n <= length(description)
group by substr(t.description,c.n,1)
order by c

      




+---+-----+
| C | CNT |
+---+-----+
| A |   4 |
| B |   3 |
| C |   2 |
| E |   1 |
| O |   1 |
| P |   2 |
|  |   1 |
+---+-----+

      

+3


source


Create a table of numbers and fill it with all the required identifiers (in this case, the string length is 1..max)



SELECT DISTINCT
  locate(your_table.description, numbers.id)   AS symbol
FROM
  your_table
INNER JOIN
  numbers
    ON  numbers.id >= 1
    AND numbers.id <= CHAR_LENGTH(your_table.description)

      

0


source


SELECT DISTINCT(SUBSTR(ll,LEVEL,1)) OP --Here DISTINCT(SUBSTR(ll,LEVEL,1)) is used to get all distinct character/numeric in vertical as per requirment
FROM
( 
    SELECT LISTAGG(DES,'') 
    WITHIN GROUP (ORDER BY ID) ll 
    FROM My_Table  --Here listagg is used to convert all values under description(des) column into a single value and there is no space in between
)
CONNECT BY LEVEL <= LENGTH(ll);

      

0


source







All Articles