1

私たちの現在のアプリケーションでは、NLSSORT=generic_m_ai によってデータをフィルター処理することができます。それによってもグループ化できるようにしたいと考えています。現在、小さなテーブルでテストしていますが、「case」ステートメントを実際のクエリと同様に維持しています

これが私のテーブルの作成方法です:

create table alex_collate_test
(aaa varchar(30),
bbb varchar(30), primary key(aaa, bbb))
insert into alex_collate_test values ('hi', 'bye')
insert into alex_collate_test values ('HI', 'bye')
insert into alex_collate_test values ('hi', 'BYE')
insert into alex_collate_test values ('HI', 'BYE')
insert into alex_collate_test values ('next', 'howdy')

通常のグループは次のとおりです。

select case when aaa is null or length(aaa) = 0 then '(blank) - '|| case when bbb is null then '' else bbb end  else aaa||' - '|| case when bbb is null then '' else bbb end  end mycolumn
from alex_collate_test
group by case when aaa is null or length(aaa) = 0 then '(blank) - '|| case when bbb is null then '' else bbb end  else aaa||' - '|| case when bbb is null then '' else bbb end  end

そして得る:

hi - BYE                                                        
HI - BYE                                                        
hi - bye                                                        
next - howdy                                                    
HI - bye 

MSSQL の「Collat​​e」コードに従い、列を「NLSSORT」でラップしています。

select NLSSORT(case when aaa is null or length(aaa) = 0 then '(blank) - '|| case when bbb is null then '' else bbb end  else aaa||' - '|| case when bbb is null then '' else bbb end  end, 'NLS_SORT=generic_m_ai') mycolumn
from alex_collate_test
group by NLSSORT(case when aaa is null or length(aaa) = 0 then '(blank) - '|| case when bbb is null then '' else bbb end  else aaa||' - '|| case when bbb is null then '' else bbb end  end , 'NLS_SORT=generic_m_ai')

そして、この出力を取得します:

0213021B01EF026701FE
023201FE0266025502130238026401F70267

最初は 16 進数のように見えますが、varchar に変換するだけですが、よく見ると 16 進数ではありません。'02' があります。これは、'hi' や 'bye' などの通常の文字ではありません。

私の予想される出力、またはむしろ私が取得したいのはこれです:

HI - BYE
next - howdy
4

2 に答える 2

1

NLSSORTその値を使用してソートを実行するために使用されるバイトを示し、RAW値です。したがって、直接的には役に立ちません。

ただし、これを間接的に使用してこれを実現できます。もっと簡単な方法があるかもしれませんが、並べ替え順序に基づいて疑似列を提供する分析関数を使用するとうまくいくようです:

select mygroupcolumn
from (
  select mycolumn, first_value(mycolumn)
    over (partition by NLSSORT(mycolumn, 'NLS_SORT=generic_m_ai')
      order by NLSSORT(mycolumn, 'NLS_SORT=generic_m_ai')) as mygroupcolumn
  from (
    select case when aaa is null or length(aaa) = 0 then '(blank)' else aaa end
      || ' - ' || case when bbb is not null then bbb end as mycolumn
    from alex_collate_test
  )
)
group by mygroupcolumn
order by mygroupcolumn;

MYGROUPCOLUMN                                                 
---------------------------------------------------------------
HI - BYE                                                        
next - howdy                                                    

また、構造を単純化 (IMO) しましたが、実際のcase構造ではそれほど単純ではないかもしれません。

結果をさらに確認するために数値列を追加すると、何らかの理由でグループ化すると仮定すると、クエリは次のようになります。

MYCOLUMN                                                          SUM(CCC)
--------------------------------------------------------------- ----------
HI - BYE                                                                 8 
HI - bye                                                                 2 
hi - BYE                                                                 4 
hi - bye                                                                 1 
next - howdy                                                            16 

そして私のcccものは、内部クエリからその値を取得するための調整を加えたものです。

select mygroupcolumn, sum(ccc)
from (
  select mycolumn, ccc, first_value(mycolumn)
    over (partition by NLSSORT(mycolumn, 'NLS_SORT=generic_m_ai')
      order by NLSSORT(mycolumn, 'NLS_SORT=generic_m_ai')) as mygroupcolumn
  from (
    select case when aaa is null or length(aaa) = 0 then '(blank)' else aaa end
      || ' - ' || case when bbb is not null then bbb end as mycolumn, ccc
    from alex_collate_test
  )
)
group by mygroupcolumn
order by mygroupcolumn;

... 取得:

MYGROUPCOLUMN                                                     SUM(CCC)
--------------------------------------------------------------- ----------
HI - BYE                                                                15 
next - howdy                                                            16 

私は再実装しMIN()たようです。@kordirkoの答えはもっと簡単です。同じデータを使用すると、次の結果も得られます。

select min(mycolumn), sum(ccc)
from (
  select case when aaa is null or length(aaa) = 0 then '(blank)' else aaa end
    || ' - ' || case when bbb is not null then bbb end as mycolumn, ccc
  from alex_collate_test
)
group by NLSSORT(mycolumn, 'NLS_SORT=generic_m_ai')
order by NLSSORT(mycolumn, 'NLS_SORT=generic_m_ai');

MIN(MYCOLUMN)                                                     SUM(CCC)
--------------------------------------------------------------- ----------
HI - BYE                                                                15 
next - howdy                                                            16 

...とにかく他の分析結果が必要でない限り、私はおそらくそれで行くでしょう。

于 2013-07-15T19:25:40.303 に答える