2017-08-22 10 views
2

私は以下のクエリを実行しようとしているときにエラーが発生しました。誰もこれを評価していただければ幸いです。データ型varcharを数値に変換中にエラーが発生しました。数値を比較しようとすると

DECLARE @TABLE TABLE(ID INT,CATEGORY VARCHAR(30),VALUE VARCHAR(30)) 
INSERT INTO @TABLE 
SELECT 1,'A','5' 
UNION ALL 
SELECT 2,'B','6' 
UNION ALL 
SELECT 3,'C','VAL' 
UNION ALL 
SELECT 4,'D','HSD' 

DECLARE @TABLE1 TABLE(ID INT,CATEGORY VARCHAR(30),VALUE VARCHAR(30)) 
INSERT INTO @TABLE1 
SELECT 1,'A','5.0' 
UNION ALL 
SELECT 2,'B','6.0' 
UNION ALL 
SELECT 3,'C','VAL' 
UNION ALL 
SELECT 4,'D','HSD' 

SELECT 
    A.ID, 
    A.CATEGORY, 
    A.VALUE 
FROM @TABLE A, @TABLE1 B 
WHERE 
    CASE ISNUMERIC(A.VALUE) WHEN 1 THEN CAST (A.VALUE AS NUMERIC) 
            ELSE A.VALUE END=CASE ISNUMERIC(B.VALUE) WHEN 1 
            THEN CAST (B.VALUE AS NUMERIC) ELSE B.VALUE END 

答えて

3

私はあなたが取得しているエラーがWHERE句のあなたのCASE式は、異なるタイプ、すなわちテキストと数値との枝を持っていることに起因していると信じています。これを修正するには、すべてのブランチを同じタイプにする必要があります。すべての数字をテキストにすることはできませんが、代わりにすべてのテキストを作ることができます。

数値データの場合、同じ種類のデータもありません。これを回避するには、テキストに再び変換する前に、共通の小数点フォーマットに数値データをキャストすることができます

WHERE 
    CASE WHEN ISNUMERIC(A.VALUE) = 1 
     THEN CONVERT(VARCHAR, CAST(A.VALUE AS DECIMAL(10,2))) 
     ELSE A.VALUE END = 
    CASE WHEN ISNUMERIC(B.VALUE) = 1 
     THEN CONVERT(VARCHAR, CAST(B.VALUE AS DECIMAL(10,2))) 
     ELSE B.VALUE END 

あなたのための最良の長期的な解決策は、同じ列にテキストや数値データを混在させないことであろう。なぜ私はこの答えが下落されたのか分かりません。元の質問に答える作業コードです。

出力:ここ

enter image description here

デモ:列は一種類のみ可能

Rextester

-2

一つ..

次の2つを置くことができませんタイプ "NUMERIC"と "varchar(30)"を1列に...

最良の方法は1つの型にキャストされます。 varchar(30)が良い選択と思われます。

+1

数値データのいずれも一致していないため、これはOPの望みではないと思います。[ここをクリック](http://rextester.com/NAI20018) –

+0

@TimBiegeleisen入手できました。私は質問を間違って... –

関連する問題