0

SQL Server にこのデータを含むテーブルがあります。

Id
=====
1
12e
5 

そして、このデータを次のように注文したいと思います:

id
====
1
5
12e 

id列のタイプが で、nvarchar(50)に変換できませんint

この方法でデータをソートすることは可能ですか?

4

3 に答える 3

3

原則として、列の一部を操作している場合は、ほぼ確実に間違っています

ID が数字とアルファベットのコンポーネントで構成されていて、数字のビットだけをいじる必要がある場合は、2 列にして不安を解消してください。その場合、整数id_numericと varcharid_alphaがあり、クエリは単純です。

select   char(id_numeric) | id_alpha as id
from     mytable
order by id_numeric asc

または、それを単一の列として保存する必要がある場合は、追加の列を作成して個々の部分を保持し、それらを並べ替えと選択に使用します。ただし、重複データが連続して発生する問題を軽減するために、トリガーを使用してデータの一貫性を確保します。

select   id
from     mytable
order by id_numeric asc

通常、すべての選択でこの分割を行う必要はありません。これは、スケーリングがうまくいかないためです。更新/挿入トリガーとして実行することにより、必要な場合 (つまり、データが変更された場合) にのみ分割を実行し、このコストはすべての選択で償却されます。ほとんどの場合、データベースは書き込まれるよりもはるかに頻繁に読み取られるため、これは良い考えです。

また、パフォーマンス上の理由から、より低いレベルの正規化に戻すことは、完全に通常の方法です。ただし、結果を理解し、軽減することが条件です。

于 2012-05-26T04:57:27.140 に答える
1

私は実際にはこの関数のラインに沿って何かを使用しますが、超高速ではないことに注意してください. 数値のみを返すようにその関数を変更しました。

CREATE FUNCTION dbo.UDF_ParseNumericChars
(
  @string VARCHAR(8000)
)
RETURNS VARCHAR(8000)
WITH SCHEMABINDING
AS
BEGIN
  DECLARE @IncorrectCharLoc SMALLINT
  SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
  WHILE @IncorrectCharLoc > 0
  BEGIN
    SET @string = STUFF(@string, @IncorrectCharLoc, 1, '')
    SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
  END
  SET @string = @string
  RETURN @string
END
GO

その関数を作成したら、次のようにソートできます。

  SELECT YourMixedColumn
    FROM YourTable
ORDER BY CONVERT(INT, dbo.UDF_ParseNumericChars(YourMixedColumn))
于 2012-05-26T04:58:31.383 に答える
0

Len関数でソート可能

 create table #temp (id nvarchar(50) null)
 select * from #temp order by LEN(id)
于 2012-05-26T05:18:11.697 に答える