1

データベースで、データの一部として数字を含むテキスト フィールドがあり、ソートしようとすると、数字が順番に返されず、アルファベット順に「疑似」されます。

私はこの振る舞いを「期待」しており、それに満足しています。ただし、ユーザーは、可能であれば数値およびアルファベット順にソートするように要求しました。

例のデータ (ソート済み):

100
1001
1110
1010101E
2
200
22ER
Abd
Bre

顧客が - 「100」の前に「2」をソートし、「1001」の前に「200」をソートすることを望んでいる場合、これが固執する場所は、数字/文字の組み合わせが発生する場所です。この問題は、「ファーストネーム」による順序のように、名前を付ける項目に任意の名前 (「ボックス 1」、「ボックス 1」、「ボックス 1」、「1 ボックス」、「1」など...) を付けることができるという事実によるものですが、多くの人が自分の子供に数字の名前を付けています。並べ替えは悪夢です。

私は、すべての「数値のみ」のフィールドのUNIONを実行し、数値にキャストしてソートし、次に英数字と結合するというアイデアをいじりました...したがって、少なくとも数値は「期待どおり」でした-しかしオーバーヘッドは法外なようです。

ユーザーの要求に従って、「2erd」は「100」の前にソートされ、「22Asd」は「22asd」の前にソートされると予想されます

提案や解決策はありますか?これは出てくるはずです。DB2 v9.5 を使用しています

「0000123」は「122」の前にソートされるため、先行ゼロも「問題」です。

4

4 に答える 4

1

手元に 9.5 インスタンスはありませんが、DB2 9.5 で利用可能な機能のみを使用するため、これは機能するはずです。

  db2 => with input (f) as ( 
    values ('100'), ('1001'), ('1110'), ('1010101E'),
   ('2'), ('200'), ('22ER'), ('Abd'), ('Bre')
  )
  select * from input
  order by case 
    when 
      length(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) = 0 
        then 9999999999999 -- alpha only; make sure it sorts after all numbers
    else 
      integer(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) -- convert to integer 
  end, -- this column is numeric
  case
    when 
      length(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) = 0 
        then f -- alpha only
    else '' -- nothing; sorts before other strings 
  end
  ; 

  F       
  --------
  2       
  22ER    
  100     
  200     
  1001    
  1110    
  1010101E
  Abd     
  Bre     

    9 record(s) selected.

TRANSLATE 関数を使用して、列の値から数値以外の文字を削除し、残りのデータを数値順に並べ替えることができます。

于 2013-06-07T18:05:01.720 に答える
0

次のようなことができますか (sortfield が 11 文字未満であると仮定すると、それが長い場合は、ゼロと切り捨てポイントの数を増やすか、テストを行う必要があります):

右から並べる(concat("0000000000", sortField), 10)

于 2013-06-08T00:12:02.717 に答える
0

別のアプローチは、文字列をトリミングして右揃えにすることです。列の幅が 20 文字だとします。次のようなものを使用できます

right(repeat(' ',20)||trim(yourdata),20)

確かに、文字列が数字以外の文字で始まる場合、これはうまく機能しません。

于 2013-06-08T00:08:17.527 に答える