nvarchar列を整数としてソートする
-
02-07-2019 - |
質問
nvarchar列にデータが混在しています(単語と数字)。 この列のデータを数値順に並べ替える最も速い方法です。
結果の例:
- 1
- 2
- 3
- ...
- 10
- 11
- ...
- aaaa
- aaab
- b
- 実行
- 実行
- ...
解決
これを使用:
ORDER BY
CASE WHEN ISNUMERIC(column) = 1 THEN 0 ELSE 1 END,
CASE WHEN ISNUMERIC(column) = 1 THEN CAST(column AS INT) ELSE 0 END,
column
これは期待どおりに機能します。
注:最速の方法と言います。このsqlは私が作成するのに高速でしたが、実行計画にはテーブルスキャンとそれに続くスカラー計算が示されています。これにより、その列のすべての値とISNUMERIC結果用の追加の一時列を含む一時結果が生成される可能性があります。実行が高速でない場合があります。
他のヒント
数字に0を残してソートすると、希望する結果が得られます。パディングする0の数がvarchar列のサイズと一致することを確認する必要があります。
この例を見てください...
Declare @Temp Table(Data VarChar(20))
Insert Into @Temp Values('1')
Insert Into @Temp Values('2')
Insert Into @Temp Values('3')
Insert Into @Temp Values('10')
Insert Into @Temp Values('11')
Insert Into @Temp Values('aaaa')
Insert Into @Temp Values('aaab')
Insert Into @Temp Values('b')
Insert Into @Temp Values('ba')
Insert Into @Temp Values('ba')
Select * From @Temp
Order By Case When IsNumeric(Data) = 1
Then Right('0000000000000000000' + Data, 20)
Else Data End
また、caseステートメントを使用する場合、caseステートメントの各ブランチが同じデータ型を返すことが重要であることに注意してください。そうしないと、誤った結果またはエラーが発生します。
-存在の確認
存在する場合(*をdbo.sysobjectsから選択します。ここで、[id] = object_id(N'dbo.t ')AND objectproperty(id、N'IsUserTable')= 1)
ドロップテーブルdbo.t
行く
-サンプルテーブルの作成
テーブルdbo.tを作成(c varchar(10)not null)
nocountをオンに設定
-テーブル例の入力
dbo.t(c)の値( '1')に挿入します
dbo.t(c)の値( '2')に挿入します
dbo.t(c)の値に挿入( '3')
dbo.t(c)の値に挿入('10 ')
dbo.t(c)の値( '11')に挿入します
dbo.t(c)値( 'aaaa')に挿入します
dbo.t(c)の値に挿入( 'aaab')
dbo.t(c)の値( 'b')に挿入します
dbo.t(c)の値( 'ba')に挿入します
dbo.t(c)の値( 'ba')に挿入します
-データを返す
dbo.t
からcを選択します
isnumeric(c)= 1の場合、0の場合、1の場合は終了、
isnumeric(c)= 1の場合、cast(c as int)else 0の終わり、
c
データを英数字または数値として扱うことができます。両方を同時に扱うことはできません。あなたがしようとしていることが可能だとは思わない、データモデルが適切に設定されていない。
あなたがやろうとしていることとは思わない 可能です
この例は問題なく動作します
SELECT * FROM TableName
ORDER BY CASE WHEN 1 = IsNumeric(ColumnName) THEN Cast(ColumnName AS INT) END
結果は次のとおりです:
- a
- b
- c
- ...
- 1
- 2
- 3
しかし、最初に数字が必要です。
これは動作するはずです:
select * from Table order by ascii(Column)
キャストします。
SELECT * FROM foo ORDER BY CAST(somecolumn AS int);
SQL Serverに触れてからしばらく経ったので、構文はまったく間違っているかもしれません:)