- PR -

SQLServer2005 Cast 文字列を数値に変換するには?

1
投稿者投稿内容
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2008-02-12 19:29
お世話になっております

 SQL SERVER 2005 のsqlで
 文字列を数値に変換したいのですが変換できないエラーが出ます

 具体的には
 Numeric(10.5)---->Varchar-------->Numeric
という風に 属性を一旦 Varchar にて取り出した後
 また数値として比較チェックを行い文字列として
 取得したいのですが・・・・・
 100.0000 という数値を bigint や numeric に
 Cast してみたのですが 変換できないエラーが出ます
   Convert してみてもだめでした・・・???

  MSオンラインには
 [url=http://msdn2.microsoft.com/ja-jp/library/ms187928.aspx[/url]
 「切り捨てと丸め処理の結果」の最後に

 「数値ではない char、nchar、varchar、または nvarchar 型のデータが
  int、float、numeric、または decimal 型に変換されるとき、SQL Server では
  エラー メッセージが返されます。SQL Server では、空文字列 (" ") が numeric
  または decimal 型に変換されるときにもエラーが返されます。」

 とあるのですが・・・・
 
 小数点は数値扱いされないのでしょうか?

     ご教授の程 よろしくお願いします


すみません 間違えて2度アップしてしまったので
1本は削除しました

[ メッセージ編集済み 編集者: 七 編集日時 2008-02-12 20:33 ]
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2008-02-12 20:37
select cast('100.00000' as numeric(10,5))
↑これも
select cast(cast(100.00000 as varchar(10)) as numeric(10,5))
↑これも

?うまくいきますけどね。

select 項目の実際のデータに文字列が入っているのでは?
select [項目] from [テーブル] where isnumeric([項目]) = 0
などでチェックしてみてはいかがでしょうか
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2008-02-12 21:38
よっし〜。さん ありがとうございます

 いろいろ試してみたんですが・・・
 確かに、おっしゃる通り、文字列・日付・数値と3種の
 データが 入っています
 属性別の3種の列から 一旦 VarChar の列に取りまとめたものから
 数値のものだけ数値比較をしています

引用:

よっし〜。さんの書き込み (2008-02-12 20:37) より:
select 項目の実際のデータに文字列が入っているのでは?
select [項目] from [テーブル] where isnumeric([項目]) = 0
などでチェックしてみてはいかがでしょうか



簡単なSQLを作成して 試してみました

以下のSQL文の 中の Select のみを実行すると
変換中のオーバーフローのメッセージが出るものの
結果は返ってきました
下記のように SELECT の入れ子にしてしまうと
変換エラーになってしまいます
   ちなみに AValue の値は
111.11100
222.00000
という値が入っています
Test というテーブルは ビューです
このビューの中で Varchar列、Datetime列、Numeric(10,5)列
の値を、 Avalue列として 取りまとめています

SELECT nu, AValue
FROM (SELECT CAST(AValue AS numeric(10, 5)) AS nu, AValue
FROM Test
WHERE (isnumeric(AValue) = 1) ) AS d
WHERE (nu > 1111.00000)


今回 UNIONにてデータを連結したものに対して
データを抽出せねばならなかったので
こんな入れ子になってしまいました・・・・

すみません 情報が足りない状態でした
よろしくお願いいたします
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2008-02-13 13:07
SELECT * FROM TESTA
を実行した時点でエラーになったりしませんか?
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2008-02-14 15:43
よっし〜。さん 返信、有難うございます
昨日はお休みを頂いていたので 連絡が遅くなってしまい
申し訳ありません

引用:

よっし〜。さんの書き込み (2008-02-13 13:07) より:
SELECT * FROM TESTA
を実行した時点でエラーになったりしませんか?



1、SELECT * FROM TEST
2、SELECT * FROM( SELECT * FROM TEST WHERE (isnumeric(AValue) = 1) ) AS d
共に エラーにはなりません

ちなみに AValue には NULL または 数値の入った行が存在します

1つの行で 属性にわけて 値を持っています

属性 Num_Value(Type=Numeric) Char_Value(Type=Varchar)
----------------------------------------------------------------------------
行A N 1111.0000 Null
行B C Null XXXXXXXXXX

このテーブルを

属性 AValue(Type=Varchar)
---------------------------------------------
行A N 1111.0000
行B C XXXXXXXXXX

変換した テンポラリテーブルにて 条件チェックを入れてました

元のテーブルでチェックをすれば CASTする必要がないので
うまくいくのですが
全体的には 都合が悪かったりするので、悩みどころです
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2008-02-14 20:54
引用:

七さんの書き込み (2008-02-12 21:38) より:

SELECT nu, AValue
FROM (SELECT CAST(AValue AS numeric(10, 5)) AS nu, AValue
FROM Test
WHERE (isnumeric(AValue) = 1) ) AS d
WHERE (nu > 1111.00000)



現象確認できました。

WHERE (cast(nu as numeric(10, 5)) > 1111.00000)
としてみてもたしかにダメでしたが。

WHERE (cast(nu as numeric(11, 5)) > 1111.00000)
としてみてください。
おそらく大丈夫です。


>自己補足
ただし、なぜこうなるのかは調査する必要がありますね。
(Cast時の丸めの問題だろうことしか予測できません。)


[ メッセージ編集済み 編集者: よっし〜。 編集日時 2008-02-18 09:14 ]
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2008-02-17 00:47
引用:

よっし〜。さんの書き込み (2008-02-14 20:54) より:
WHERE (cast(nu as numeric(11, 5)) > 1111.00000)
としてみてください。
おそらく大丈夫です。



遅くなりました
ありがとうございました
うまくいきました
1

スキルアップ/キャリアアップ(JOB@IT)