Oracle Database 19c 標準版 2 發行版 19.0.0.0.0 - 生產
select letter from (
select 'A' as letter from dual union all
select 'á' as letter from dual union all
select 'B' as letter from dual union all
select 'C' as letter from dual ) t
order by letter;
結果(沒問題):
A
á
B
C
但是有了這個
select listagg(letter,', ') within group (order by letter) from (
select 'A' as letter from dual union all
select 'á' as letter from dual union all
select 'B' as letter from dual union all
select 'C' as letter from dual ) t;
結果字母的順序不同:
A, B, C, á
在后一種情況下,這是一個簡單的 Oracle 錯誤嗎?
(我沒有說任何關于 NLS 的事情。我認為這些查詢應該獨立于 NLS 以相同的方式作業。)
更新:
說明:我在 SqlDeveloper 中的同一個連接中一個接一個地運行這些查詢。
NLS_SORT HUNGARIAN
NLS_COMP BINARY
(如果@MT0 的答案是解決方案,那么恕我直言,這是 oracle 中的一個錯誤,在簡單的 order by 子句和 listagg 呼叫上使用不同的默認 NLS 設定。)
uj5u.com熱心網友回復:
您需要提供NLS_SORT設定:
select listagg(letter,', ')
within group (order by NLSSORT(letter, 'NLS_SORT=BINARY_AI')) AS letters
from (
select 'A' as letter from dual union all
select 'á' as letter from dual union all
select 'B' as letter from dual union all
select 'C' as letter from dual
) t;
輸出:
信件 A、A、B、C
注意:在其子句中LISTAGG似乎沒有使用會話NLS_SORT設定ORDER BY;但是你可以直接傳入,如上圖所示。
如果要使用會話引數(而不是特定值):
select listagg(letter,', ')
within group (
order by NLSSORT(
letter,
( SELECT 'NLS_SORT='||value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_SORT' )
)
) AS letters
from (
select 'A' as letter from dual union all
select 'á' as letter from dual union all
select 'B' as letter from dual union all
select 'C' as letter from dual
) t;
db<>在這里擺弄
uj5u.com熱心網友回復:
字母的順序主要取決于NLS_SORT,因此您在訊息末尾所說的完全錯誤。
主要問題是 - 您是否在完全相同的系統上獲得了這些相互矛盾的結果,并具有所有相同的 NLS 設定?如果是這樣,那么這是在執行中的錯誤ORDER BY條款LISTAGG。最好有一個測驗用例 - 向我們展示您的 NLS 設定( 的結果select * from v$nls_parameters),緊接著是兩個查詢及其輸出。為了更好地衡量,還顯示select * from v$version(告訴我們您的資料庫版本)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/367871.html
