回答
從http://forums.oracle.com/forums/thread.jspa?messageID=1791550這可能工作,但不擁有10g來測試的答案...
SELECT MIN(permutations)
FROM (SELECT REPLACE (SYS_CONNECT_BY_PATH (n, ','), ',') permutations
FROM (SELECT LEVEL l, SUBSTR ('&col', LEVEL, 1) n
FROM DUAL
CONNECT BY LEVEL <= LENGTH ('&col')) yourtable
CONNECT BY NOCYCLE l != PRIOR l)
WHERE LENGTH (permutations) = LENGTH ('&col')
在這個例子中col
是在SQL * Plus定義的,但如果你把這個函數你可以傳入它,或者可以直接將它改寫成表格列。
我會以此爲出發點而不是解決方案;最初的問題是關於anagrams,所以它被設計爲查找所有的排列,所以類似但簡化的東西可能是可能的。我懷疑這對於大數值並不能很好地擴展。
假設你不介意的人物每行返回1:
select substr(str, r, 1) X from (
select 'CAB' str,
rownum r
from dual connect by level <= 4000
) where r <= length(str) order by X;
X
=
A
B
C
你應該記住,沒有共同的協議是什麼「字母」的意思。這完全取決於它是哪個國家,誰在查看你的數據以及它處於什麼背景。
例如在DK中,有大量不同的a,a,b,c, ,O,A
- 每字母表:A,AA,b,C,æ,O,A
- 一些字典:A,AA,A,b,C,æ,ø
- 對於其他字典:a,b,c,æ,ø,aa,
- 按照Microsoft標準:a,b,c,æ,ø,aa,å
查看更多信息http://www.siao2.com/2006/04/27/584439.aspx。這也是碰巧成爲這些問題的好博客。
因此,最終我去了PL/SQL路由,因爲經過一段時間的搜索後,我意識到沒有可以使用的內置函數。
這是我想出來的。它基於關聯數組的未來,即Oracle按照排序順序保存鍵。
create or replace function sort_chars(p_string in varchar2) return varchar deterministic
as
rv varchar2(4000);
ch varchar2(1);
type vcArray is table of varchar(4000) index by varchar2(1);
sorted vcArray;
key varchar2(1);
begin
for i in 1 .. length(p_string)
loop
ch := substr(p_string, i, 1);
if (sorted.exists(ch))
then
sorted(ch) := sorted(ch) || ch;
else
sorted(ch) := ch;
end if;
end loop;
rv := '';
key := sorted.FIRST;
WHILE key IS NOT NULL LOOP
rv := rv || sorted(key);
key := sorted.NEXT(key);
END LOOP;
return rv;
end;
簡單的性能測試:
set timing on;
create table test_sort_fn as
select t1.object_name || rownum as test from user_objects t1, user_objects t2;
select count(distinct test) from test_sort_fn;
select count (*) from (select sort_chars(test) from test_sort_fn);
Table created.
Elapsed: 00:00:01.32
COUNT(DISTINCTTEST)
-------------------
384400
1 row selected.
Elapsed: 00:00:00.57
COUNT(*)
----------
384400
1 row selected.
Elapsed: 00:00:00.06
您可以使用下面的查詢:
select listagg(letter)
within group (order by UPPER(letter), ASCII(letter) DESC)
from
(
select regexp_substr('gfedcbaGFEDCBA', '.', level) as letter from dual
connect by regexp_substr('gfedcbaGFEDCBA', '.', level) is not null
);
子查詢拆分使用REGEXP_SUBSTR串入記錄(每一個單個字符),和外部查詢將記錄合併爲一個字符串,使用listagg,排序後。
這裏您應該小心,因爲按照Cine指出,按字母排序取決於數據庫配置。
在上面的例子中,字母按「按字母順序排列」並按ascii代碼降序排列,在我的情況下,結果爲「aAbBcCdDeEfFgG」。 您的情況可能會有所不同。
您也可以使用nlssort對信件進行排序 - 它可以更好地控制排序順序,因爲您可以獨立於數據庫配置。
select listagg(letter)
within group (order by nlssort(letter, 'nls_sort=german')
from
(
select regexp_substr('gfedcbaGFEDCBA', '.', level) as letter from dual
connect by regexp_substr('gfedcbaGFEDCBA', '.', level) is not null
);
上面的查詢會給你也是「aAbBcCdDeEfFgG」,但如果你改變了「德國」,以「西班牙」,你會得到「AaBbCcDdEeFfGg」代替。
- 1. 按字母順序對NSString中的字符進行排序
- 2. 在php中按字母順序對數組進行排序?
- 3. 在Python中按字母順序對數組進行排序
- 4. 在objective-c中按字母順序對數組進行排序
- 5. 在QStandardItemModel中按字母順序對列進行排序:QSortFilterProxyModel
- 6. 按字母順序在模塊中對函數進行排序
- 7. 按字母順序排序字符串
- 8. 排序字符串按字母順序
- 9. 字符串進行排序按字母順序算法的c#
- 10. 按字母數字順序對MySQL列進行排序
- 11. 根據字段按字母順序對散列進行排序
- 12. 按字母順序對字典進行排序
- 13. 按字母順序排序,然後按字母順序排列
- 14. 在Java中對字符串數組按字母順序排序
- 15. 按照升序和字母順序對單個字符串進行排序
- 16. 按字母順序對角度對象進行排序
- 17. 無法按字母順序對mysql表格行進行排序
- 18. C++:按字符串對字符串進行排序,然後按字母順序排序
- 19. 按字母順序排序
- 20. 按字母順序排序
- 21. 按字母順序排序
- 22. 按字母順序排序
- 23. 排序按字母順序
- 24. 按字母順序排序
- 25. 按字母順序排序
- 26. 行進行排序的字母順序
- 27. 按字母順序排列數組,並按首字母進行排序
- 28. 按字母順序對商品排序
- 29. 使用PHP按字母順序對html字符串進行排序
- 30. 如何按照字母順序對空字符串進行排序WPF GridView?
所以如果你的列值是 選擇'CAB'從雙 它會返回'ABC'? – EvilTeach 2010-05-14 16:12:06
這是正確的。 – mtim 2010-05-14 16:15:50