web-dev-qa-db-ja.com

varcharデータ型とfloatデータ型が混在するSQL列の処理

次のような標準のvarchar形式である必要があるプロパティの区画番号を含むいくつかのExcelスプレッドシートがあります。

[Parcel # 1]          [Building Address]
038-60-171-16-000     1750 W 4th St
038-60-238-09-000     2003-2027 W 4th St
01-15393              201 5th St NE
01-13504              101 5th St SE
25-20-00-03-008.501   1800 E 5th St
36-102-0700-000       2932 S 5th St
280615                2600-B 6th St SW
31-0101.000           1202 16th St
054-259620-00.000     843 N 21st St

残念ながら、科学表記に変換された小包番号がいくつかあります。つまり、小包番号の形式が正しくなく、通常の10進数または数値形式に変換し直す必要があります。科学表記のある値だけを変換するのが困難です。列はnvarchar(255)データ型ですが、これらの値は数値または10進数データ型に戻す必要があります。

Parcel Number 1(Min)    Building Address
3.4007000221e+015   247 S Burnett Rd
3.1844401004e+013   433 N Cleveland Ave
3.4007000222e+016   2415 Lexington Ave
E020-0010-006-0211  7271 N Main St
3.6360705006e+013   825 W Market St
3.4007000353e+015   148 W North St
1.40109139e+011     4453-4461 SR-159
16-B-029-E-00-004   7314-7352 Industrial Park Blvd

上記のテーブルは、次のSELECTステートメントで取得されました

SELECT [Parcel Number 1] 
,[Building Address]
FROM XLSimport
WHERE [Parcel Number 1] like '%e%'

私の理解では、科学表記法の場合、値を小数にキャストできるはずです。ただし、正当な「E」を持つ他の小包番号は同じままにする必要があります。さまざまな「e」値を考慮に入れ、それでも科学表記法で区画番号を標準の区画番号形式に変換するにはどうすればよいですか?

Nvarcharを数値エラーメッセージに変換するエラーに頻繁に出くわし、Eが含まれているが科学的な形式ではない区画番号が原因であるのかと思います。

たとえば、次のクエリを実行します。

SELECT
CASE 
    WHEN [Parcel Number 1] like '%E+%' THEN CAST(CAST([Parcel Number 1] AS FLOAT) AS DECIMAL)
    ELSE [Parcel Number 1]
END
FROM XLSimport

その後、次のエラーが発生します。

Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to numeric.
3
Geoff Dawdy

CASEからの出力は、1つのデータ型のみです。最初のブランチはdecimalで、2番目のブランチはnvarchar(255)です。

SQL Serverの データタイプの優先順位(Transact-SQL) ルールによると、CASEの結果のデータタイプはdecimalです。

CASEの最初のブランチのnvarchar(255)にキャストをもう1つ追加します。

SELECT
CASE 
    WHEN [Parcel Number 1] like '%E+%'
    THEN CAST(CAST(CAST([Parcel Number 1] AS FLOAT) AS DECIMAL) AS NVARCHAR(255))
    ELSE [Parcel Number 1]
END
FROM XLSimport
4
Mikael Eriksson