SQL Server にこのデータを含むテーブルがあります。
Id
=====
1
12e
5
そして、このデータを次のように注文したいと思います:
id
====
1
5
12e
id
列のタイプが で、nvarchar(50)
に変換できませんint
。
この方法でデータをソートすることは可能ですか?
SQL Server にこのデータを含むテーブルがあります。
Id
=====
1
12e
5
そして、このデータを次のように注文したいと思います:
id
====
1
5
12e
id
列のタイプが で、nvarchar(50)
に変換できませんint
。
この方法でデータをソートすることは可能ですか?
原則として、列の一部を操作している場合は、ほぼ確実に間違っています。
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
通常、すべての選択でこの分割を行う必要はありません。これは、スケーリングがうまくいかないためです。更新/挿入トリガーとして実行することにより、必要な場合 (つまり、データが変更された場合) にのみ分割を実行し、このコストはすべての選択で償却されます。ほとんどの場合、データベースは書き込まれるよりもはるかに頻繁に読み取られるため、これは良い考えです。
また、パフォーマンス上の理由から、より低いレベルの正規化に戻すことは、完全に通常の方法です。ただし、結果を理解し、軽減することが条件です。
私は実際にはこの関数のラインに沿って何かを使用しますが、超高速ではないことに注意してください. 数値のみを返すようにその関数を変更しました。
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))
Len関数でソート可能
create table #temp (id nvarchar(50) null)
select * from #temp order by LEN(id)