1

ロケーション テーブルを昇順で並べ替えるように依頼されました。現在、テーブルのデータは次のようになっています。

  • 100F01
  • 105B02
  • 10B01
  • GK1-A01
  • 201E12
  • 20A01

ただし、このデータを画面に表示するときは、数値の結果を昇順で並べ替えてから、文字列の結果をアルファベット順に並べ替えます。出力は次のようになります。

  • 10B01
  • 20A01
  • 100F01
  • 105B02
  • 201E12
  • GK1-A01

次のコードを使用してみました

SELECT location FROM freelocations
ORDER BY CAST(SUBSTRING(location, 1, 2) AS INT)

ただし、予想どおり、一部の場所は数字で始まらないため、これはエラー メッセージを返します。

varchar 値 'GK' をデータ型 int に変換するときに変換に失敗しました。

どんなアイデアやヒントでも大歓迎です

4

4 に答える 4

3

たぶん、このようなものですか?

select location 
from freelocations
order by 
    case 
       when patindex('%[^0-9]%', location) = 1 then 9999999999
       else cast(substring(location, 1, patindex('%[^0-9]%', location) - 1) as int)
    end,
    location

(SQL Server には正規表現の置換機能がないため、少し不器用です)

于 2013-01-25T13:46:38.227 に答える
0

キャストを避けるためにこれを試してください:

SELECT 
    x,
    RIGHT('000' +LEFT (x,patindex('%[^0-9]%',x)-1),3) sort1,
    RIGHT (x,LEN(x)-patindex('%[^0-9]%',x)+1) sort2
FROM
(
    SELECT '123asdf' x
    UNION
    SELECT '12asdf'     
    UNION
    SELECT '13asdf'  
    UNION
    SELECT '12zsdf'  
) X
ORDER BY sort1 ,sort2 
于 2013-01-25T13:50:32.507 に答える
0

キャストする前に、最初の 2 文字または 3 文字が本当に数字かどうかを確認する必要があります。

SELECT
  location
FROM
  freelocations
ORDER BY
  CASE
    WHEN location like '[0-9][0-9][0-9]%' THEN cast(substring(location,1,3) AS INT)
    WHEN location like '[0-9][0-9]%' THEN cast(substring(location,1,2) AS INT)
    ELSE 9999
  END
于 2013-01-25T13:41:24.100 に答える
0

FIELD(文字列+0,1),文字列+0で並べ替え

ただし、「10e20」は誤解されることに注意してください。

于 2013-01-25T13:43:38.440 に答える