Как упорядочить / отсортировать строку в Oracle SQL - 11g - PullRequest
0 голосов
/ 09 мая 2018

У меня есть строка строка "ADBDkK", и мне нужно отсортировать ее как "ABDDKk", как Arrays.sort () в Java. Я знаю, что это можно сделать с помощью PL / SQL, но мне нужно это в выражении Oracle SQL.

Введите:

ADBDkK
ZXYABC

Выход:

ABDDKk
ABCXYZ

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Для строки single :

select listagg(regexp_substr('ADBDkK', '\w', 1 ,level),'') 
   within group (order by 1) from dual
connect by regexp_substr('ADBDkK', '\w', 1 ,level) is not null;

Несколько иной способ использования function:

CREATE OR REPLACE FUNCTION sort_string(my_string IN VARCHAR2)
  RETURN VARCHAR2 IS
  ret_string VARCHAR2(4000);
BEGIN
  SELECT LISTAGG(regexp_substr(my_string, '\w', 1, level), '') WITHIN
   GROUP(
   ORDER BY 1)
    INTO ret_string
    FROM dual
  CONNECT BY regexp_substr(my_string, '\w', 1, level) IS NOT NULL;
  RETURN ret_string;
END;

Тогда от sqlplus:

SQL> select sort_string('ADBDkK') as RESULT from dual;

RESULT
------
ABDDKk

SQL> select sort_string('ZXYABC') as RESULT from dual;

RESULT
------
ABCXYZ
0 голосов
/ 09 мая 2018

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE test ( value ) AS
SELECT 'ADBDkK' FROM DUAL UNION ALL
SELECT 'ZXYABC' FROM DUAL;

Запрос 1 :

WITH chars ( id, value, ch, lvl ) AS (
  SELECT ROWNUM, value, SUBSTR( value, 1, 1 ), 1
  FROM   test
UNION ALL
  SELECT id, value, SUBSTR( value, lvl+1, 1 ), lvl+1
  FROM   chars
  WHERE  lvl < LENGTH( value )
)
SELECT LISTAGG( ch ) WITHIN GROUP ( ORDER BY ch ) AS value
FROM   chars
GROUP BY id
ORDER BY id

Результаты

|  VALUE |
|--------|
| ABDDKk |
| ABCXYZ |

Запрос 2 :

SELECT LISTAGG( COLUMN_VALUE )
         WITHIN GROUP ( ORDER BY COLUMN_VALUE ) AS value
FROM   (
  SELECT value,
         ROWNUM AS id
  FROM test
) t
CROSS JOIN
TABLE(
  CAST(
    MULTISET(
      SELECT SUBSTR( t.value, LEVEL, 1 )
      FROM   DUAL
      CONNECT BY LEVEL <= LENGTH( t.value )
    )
    AS SYS.ODCIVARCHAR2LIST
  )
) c
GROUP BY t.id
ORDER BY t.id

Результаты

|  VALUE |
|--------|
| ABDDKk |
| ABCXYZ |
...