57

データベースに、文字または数字を含む列VARCHARがあります。SQL Server 2000お客様のフロントエンドでアプリケーションがどのように構成されているかによって異なります。

数字が含まれている場合は、「1」、「10」、「2」ではなく、「1」、「2」、「10」などのように数値で並べ替えます。文字のみ、または文字と数字 (「A1」など) を含むフィールドは、通常どおりアルファベット順に並べ替えることができます。たとえば、これは許容される並べ替え順序です。

1
2
10
A
B
B1

これを達成するための最良の方法は何ですか?

4

11 に答える 11

82

考えられる解決策の1つは、数値の前に文字を埋めて、すべてが同じ文字列長になるようにすることです。

そのアプローチを使用した例を次に示します。

select MyColumn
from MyTable
order by 
    case IsNumeric(MyColumn) 
        when 1 then Replicate('0', 100 - Len(MyColumn)) + MyColumn
        else MyColumn
    end

100、その列の実際の長さに置き換える必要があります。

于 2008-09-23T08:29:07.530 に答える
13

これを行うには、いくつかの方法があります。

1つは

SELECT
 ...
ORDER BY
  CASE 
    WHEN ISNUMERIC(value) = 1 THEN CONVERT(INT, value) 
    ELSE 9999999 -- or something huge
  END,
  value

ORDER BYの最初の部分は、すべてをintに変換し(非数値の場合は大きな値で、最後にソートします)、最後の部分はアルファベット順を処理します。

このクエリのパフォーマンスは、大量のデータに対して少なくとも適度に恐ろしいものになる可能性があることに注意してください。

于 2008-09-23T08:13:26.677 に答える
5
select
  Field1, Field2...
from
  Table1
order by
  isnumeric(Field1) desc,
  case when isnumeric(Field1) = 1 then cast(Field1 as int) else null end,
  Field1

これにより、質問で指定した順序で値が返されます。

すべてのキャストが行われている場合、パフォーマンスはそれほど高くないため、別のアプローチは、データの整数コピーを格納するテーブルに別の列を追加し、最初にその列で並べ替えてから、問題の列で並べ替えることです。これには明らかに、両方の列にデータを入力するために、テーブルにデータを挿入または更新するロジックにいくつかの変更が必要になります。または、データが挿入または更新されるたびに2番目の列にデータを入力するトリガーをテーブルに配置します。

于 2008-09-23T08:19:11.033 に答える
5
SELECT *, CONVERT(int, your_column) AS your_column_int
FROM your_table
ORDER BY your_column_int

また

SELECT *, CAST(your_column AS int) AS your_column_int
FROM your_table
ORDER BY your_column_int

どちらもかなり移植性があると思います。

于 2011-01-13T20:55:28.707 に答える
5

整数が短すぎる可能性があるため、いつでも varchar-column を bigint に変換できます...

select cast([yourvarchar] as BIGINT)

ただし、常にアルファベット文字を気にする必要があります

where ISNUMERIC([yourvarchar] +'e0') = 1

+'e0' はhttp://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/isnumeric-isint-isnumberから取得されます

これはあなたの声明につながるでしょう

SELECT
  *
FROM
  Table
ORDER BY
   ISNUMERIC([yourvarchar] +'e0') DESC
 , LEN([yourvarchar]) ASC

最初の並べ替え列は数値を一番上に置きます。2 番目は長さでソートされるため、10 が 0001 の前になります (これはばかげている?!)

これは 2 番目のバージョンにつながります。

SELECT
      *
    FROM
      Table
    ORDER BY
       ISNUMERIC([yourvarchar] +'e0') DESC
     , RIGHT('00000000000000000000'+[yourvarchar], 20) ASC

2 番目の列は '0' で正しくパディングされるようになったため、自然な並べ替えでは整数が先行ゼロ (0,01,10,0100...) で正しい順序で配置されます (正しい!) - ただし、すべてのアルファは '0' で拡張されます。 -chars (パフォーマンス)

3番目のバージョン:

 SELECT
          *
        FROM
          Table
        ORDER BY
           ISNUMERIC([yourvarchar] +'e0') DESC
         , CASE WHEN ISNUMERIC([yourvarchar] +'e0') = 1
                THEN RIGHT('00000000000000000000' + [yourvarchar], 20) ASC
                ELSE LTRIM(RTRIM([yourvarchar]))
           END ASC

現在、数字は最初に「0」文字で埋められます (もちろん、長さ 20 を拡張することができます) - これは数字を正しく並べ替えます - そしてアルファのみがトリミングされます

于 2013-04-03T07:35:17.060 に答える
4

これを「注文」の部分に書いて非常に簡単な方法で解決しました

ORDER BY (
sr.codice +0
)
ASC

これは非常にうまく機能しているようです。実際、次の並べ替えがありました。

16079   Customer X 
016082  Customer Y
16413   Customer Z

したがって、0の前16082は正しく考慮されます。

于 2011-07-21T09:09:52.170 に答える
2

これはうまくいくようです:

select your_column  
from your_table  
order by   
case when isnumeric(your_column) = 1 then your_column else 999999999 end,  
your_column   
于 2008-09-23T08:23:48.120 に答える
-1
SELECT FIELD FROM TABLE
ORDER BY 
  isnumeric(FIELD) desc, 
  CASE ISNUMERIC(test) 
    WHEN 1 THEN CAST(CAST(test AS MONEY) AS INT)
    ELSE NULL 
  END,
  FIELD

このリンクに従って、「$」を数値として並べ替えないように、MONEY、次にINTにキャストする必要があります。

于 2008-09-23T08:18:09.600 に答える