문자열 거꾸로 조회 후 오름차순 정렬하는 방법이 있을까요?? ㅠ
예를 들어
한국어 (왼쪽에서 오른쪽으로 입력 "훈민정음만세") , 왼쪽 기준
아랍어 (오른쪽에서 왼쪽으로 입력 "세만음정민훈"), 오른쪽 기준
A라는 컬럼에 데이터가 아래와 같이
세만음정민훈
다좋음정민훈
고최음정민훈
음정민훈은좋
음정민훈정인
데이터가 5개 있다고 생각하고 음정민훈 또는 훈민정음이나 으로 조회시 아래와 같이 오름차순으로 나오게 하는 방법이 있을가요?
(데이터가 오른쪽 기준으로 오름차순이니 ㄱ~ㅎ , 좋 인 훈 , 순으로 출력)
음정민훈은좋
음정민훈정인
세만음정민훈
다좋음정민훈
고최음정민훈
조언좀 부탁드립니다.
-- 원하시는게 맞는지 모르겠네요. WITH T ( TXT ) AS ( SELECT '세만음정민훈' FROM DUAL UNION ALL SELECT '다좋음정민훈' FROM DUAL UNION ALL SELECT '고최음정민훈' FROM DUAL UNION ALL SELECT '음정민훈은좋' FROM DUAL UNION ALL SELECT '음정민훈정인' FROM DUAL ) SELECT T.* FROM T WHERE REGEXP_LIKE(T.TXT,'[음정민훈|훈민정음]') ORDER BY SUBSTR(T.TXT,LENGTH(T.TXT) ,1) ASC
1. Reverse 라고 하는 비공식 함수가 있긴 한데...
- 한글은 안먹히네요. 비공식인 이유가 있는듯.
- 영문인 경우엔 사용 가능
2. 글자수만큼 복제하여 문자를 쪼개어 역순으로 다시 붙이는 방식도 가능한데...
- 성능이 떨어질 듯.
WITH t AS ( SELECT 1 idx, '세만음정민훈' a FROM dual UNION ALL SELECT 2, '다좋음정민훈' FROM dual UNION ALL SELECT 3, '고최음정민훈' FROM dual UNION ALL SELECT 4, '음정민훈은좋' FROM dual UNION ALL SELECT 5, '음정민훈정인' FROM dual ) SELECT idx, a , LISTAGG(SUBSTR(a, lv, 1)) WITHIN GROUP(ORDER BY lv DESC) b FROM t , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99) WHERE lv <= LENGTH(a) GROUP BY idx, a ORDER BY b ;
3. 글자수가 길지 않은 단어 수준이라면?
- 복제 없이 그냥 쪼개어 정렬해도 될 듯
- 단, 성능은 향상되나 무식해 보일 수 있음.
SELECT idx, a FROM t ORDER BY SUBSTR(a, -1, 1) , SUBSTR(a, -2, 1) , SUBSTR(a, -3, 1) , SUBSTR(a, -4, 1) , SUBSTR(a, -5, 1) , SUBSTR(a, -6, 1) , SUBSTR(a, -7, 1) , SUBSTR(a, -8, 1) , SUBSTR(a, -9, 1) ;
with t as ( select 'ذراع' text from dual union all select 'ظهر' from dual union all select 'خدين' from dual union all select 'صدر' from dual) select * from t order by text asc;
with t as ( select 'ذراع' text from dual union all select 'ظهر' from dual union all select 'خدين' from dual union all select 'صدر' from dual) select * from t order by nlssort(text, 'NLS_SORT=ARABIC')
with t as ( select 'ـا' text from dual union all select 'ـب' from dual union all select 'ـج' from dual union all select 'ـت' from dual) select * from t order by text;
테스트 데이터는 위와 같이 해봤습니다.
저도 아랍어는 잘 모르지만, 아랍 알파벳을 구글에서 검색해보니 아래와 같은 순서라는 것을 알 수 있습니다.
아랍어 알파벳 : http://mylanguages.org/ko/arabic_alphabet.php
참고사항 : 위 알파벳이 순서대로 정렬된 것이 아니라면, 아래 가정은 틀릴 수 있습니다. ^^;
with t as ( select 'ـا' text from dual union all select 'ـب' from dual union all select 'ـج' from dual union all select 'ـت' from dual) select * from t; TEXT ـا ـب ـج ـت 4 rows selected. with t as ( select 'ـا' text from dual union all select 'ـب' from dual union all select 'ـج' from dual union all select 'ـت' from dual) select * from t order by text asc; TEXT ـا ـب ـت ـج 4 rows selected.
-- 위 아랍어 알파벳 사이트에서 알파벳 순서를 확인해보면 1,2,4,3 순으로 표기됩니다.
with t as ( select 'ـا1' text from dual union all select 'ـب2' from dual union all select 'ـج3' from dual union all select 'ـت4' from dual) select * from t; TEXT ـا1 ـب2 ـج3 ـت4 4 rows selected. -- 해당 컬럼을 정렬하면 알파벳 순으로 정렬됨 with t as ( select 'ـا1' text from dual union all select 'ـب2' from dual union all select 'ـج3' from dual union all select 'ـت4' from dual) select * from t order by text asc; TEXT ـا1 ـب2 ـت4 ـج3 4 rows selected. -- 강제로 정렬방식을 아랍어순으로 변경한 경우로, 결과가 위와 동일함 with t as ( select 'ـا1' text from dual union all select 'ـب2' from dual union all select 'ـج3' from dual union all select 'ـت4' from dual) select * from t order by nlssort(text, 'NLS_SORT=ARABIC'); TEXT ـا1 ـب2 ـت4 ـج3 4 rows selected.
그러므로 따로 처리를 하지 않아도 오라클은 아랍어를 오른쪽에서 왼쪽 어순으로 자동으로 정렬해 준다는 것을 확인할 수 있었습니다.
와 신기하네요. 헐~ 대박~
아랍어 치면 자동으로 우에서 좌로 채워지네요..
눈에 보이는대로 좌측거 지운다고 맨 앞에 커서 놓고 딜리트 누르면 우측게 지워짐.
눈에 보이는대로 우측거 지운다고 맨 뒤에 커서 놓고 백스페이스 누르면 좌측게 지워짐.
DUMP 를 떠보면 실제로는 타이핑 치는 그대로 좌에서 우로 저장되네요.
대신 화면에 보일 때만 거꾸로 보이는 듯?
WITH t AS ( SELECT 'ـ' text FROM dual -- b UNION ALL SELECT 'ا' text FROM dual -- a UNION ALL SELECT 'ـا' text FROM dual -- ab 로 보임(실제로는 타이핑 순서대로 ba 로 저장됨) ) SELECT text , DUMP(text, 16) FROM t ORDER BY text ; -- 결과 -- ا Typ=1 Len=2: d8,a7 ـ Typ=1 Len=2: d9,80 ـا Typ=1 Len=4: d9,80,d8,a7