将数据类型varchar转换为数字时出错。当尝试比较数字时

时间:2017-08-22 05:39:08

标签: sql sql-server

当我尝试执行以下查询时出错。任何人都可以解决这个问题。

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

2 个答案:

答案 0 :(得分:3)

我相信你得到的错误是由于CASE子句中的WHERE表达式具有不同类型的分支,即文本和数字。要解决此问题,您需要使所有分支都是相同的类型。由于文本的原因,使所有数字都不起作用,但我们可以将所有内容都改为文本。

对于数字数据的情况,您甚至没有相同类型的数据。为了解决这个问题,您可以将数值数据转换为通用的十进制格式,然后再转换回文本:

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

答案 1 :(得分:-2)

一列只能是一种类型..

你不能把两种类型&#34; NUMERIC&#34;和&#34; varchar(30)&#34;在一栏中......

最佳方式是投射到一种类型。似乎varchar(30)是一个更好的选择。

wait