郵便番号を正しく表示するためのいくつかの問題を解決しようとしています。
元のスプレッドシートには、5桁と9桁の形式が混在する郵便番号が含まれています。インポートプロセスの後、これらの9桁の郵便番号は12桁の長さを報告しています。 9桁の郵便番号にハイフン「-」を追加しようとすると、長さの誤りやさまざまなデータ型変換の問題により、異常な結果やエラーが発生します。
インポートは、スプレッドシートからデータをインポートするためのopenrowsetメソッドを使用して実行されました。
新しくインポートしたデータをクエリすると、郵便番号がスプレッドシートに表示されていたのと同じように表示されますが、長さが間違っています。
SELECT Zip,
LEN(LTRIM(RTRIM(Zip))) AS ZIPLENGTH
FROM XLS_IMPORT
Zip ZIPLENGTH
45750 5
432013256 12
441153221 12
44120 5
441351362 12
データの左9文字を選択すると、すべてが浮動小数点に変換され、郵便番号が読み取れなくなります。
SELECT LEFT(Zip,9) FROM XLS_IMPORT
WHERE LEN(LTRIM(RTRIM(Zip))) = 12
Zip
4.32013e+
4.42034e+
4.56637e+
4.41153e+
4.36045e+
4.41133e+
これらの郵便番号を正しい9桁に戻すにはどうすればよいですか?または、長さ12を報告している9桁の郵便番号にハイフンを追加するにはどうすればよいですか?私の最終目標は、9桁の郵便番号の中央にハイフンを付けることです。
Zip
列のデータ型はfloat
です。
NJやNYなどのスプレッドシートの一部に、郵便番号の先頭の0の前にアポストロフィがあることがわかりました。これを私のスプレッドシートのインポートの一部で機能させるために、 '0xxxx郵便番号を処理する方法を調査する必要があります。
明らかに、この時点で、郵便番号は数値ではなく文字列として保存する必要があることに気づきました。外国の(米国以外の)郵便番号に頻繁に文字が含まれているという事実以外に理由がない場合。
とはいえ、元の質問に戻りましょう。 5桁のときに長さが5を表示し、9桁しか格納していないときに長さが12だったのはなぜですか。 LEN関数 の動作方法と関係があります。このサンプルコードのXML実行プランを見ると、次のようになります。
_CREATE TABLE #temp (MyFloat float, MyStr varchar(50))
INSERT INTO #temp VALUES (12345,'12345'),(123456789,'123456789')
SELECT len(MyFloat), len(MyStr) FROM #temp
_
次の2行に注目してください。
_<ScalarOperator ScalarString="len(CONVERT_IMPLICIT(varchar(23),[tempdb].[dbo].[#temp].[MyFloat],0))">
<ScalarOperator ScalarString="len([tempdb].[dbo].[#temp].[MyStr])">
_
LEN
を取得する前に、フロート値をvarchar(23)
に変換する_CONVERT_IMPLICIT
_がどのように舞台裏で見られますか? (私が知ることができるものから、LEN
は実際には文字列でのみ機能します。)
では、明示的な変換を行うことで、_CONVERT_IMPLICIT
_が実際に何を返しているかを見てみましょう。
_SELECT CONVERT(varchar(23), MyFloat) FROM #temp
_
そして今、_12345
_がきれいに変換されることがわかります。 _123456789
_ただし、科学表記法が必要でした。 _1.23457e+008
_を提供してください。これは12文字の長さです。
郵便番号は、floatデータ型としてインポートされました。列をfloatからvarchar(10)に直接変換できませんでした。代わりに、データ型をfloatからdecimalに変換し、次にdecimalからvarchar(10)に変換しました。これで、列は正しい数の郵便番号桁(9)を報告します。これにより、9桁の郵便番号にハイフンを挿入できるようになりました。